1、get 和 post 的区别GET 和 POST 区别详解 收藏 1、Get 是用来从服务器上获得数据,而 Post 是用来向服务器上传递数据。 2、Get 将表单中数据的按照 variable=value 的形式,添加到action 所指向的 URL 后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post 是将表单中的数据放在 form 的数据体中,按照变量和值相对应的方式,传递到 action 所指向 URL。 3、Get 是不安全的,因为在传输过程,数据被放在请求的 URL 中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL 记录到日志文件中,然后放在某个地
2、方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post 的所有操作对用户来说都是不可见的。 4、Get 传输的数据量小,这主要是因为受 URL 长度限制;而 Post可以传输大量的数据,所以在上传文件只能使用 Post(当然还有一个原因,将在后面的提到) 。 5、Get 限制 Form 表单的数据集的值必须为 ASCII 字符;而 Post 支持整个 ISO10646 字符集。默认是用 ISO-8859-1 编码 6、Get 是 Form 的默认方法。以下的比较非常非常使用:转载自 http:/ 做 java
3、 的 web 开发有段日子了,有个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真的很多) ,都是一大堆的介绍如何解决此类的乱码问题,但是没几个把问题的来龙去脉说清楚的,有时候看了些文章后,以为自己懂了,但是在开发中乱码问题又像鬼魂一样出来吓人,真是头大了!这篇文章是我长时间和乱码做斗争的一些理解的积累,还希望有更多的朋友给出指点和补充。 form 有 2 中方法把数据提交给服务器,get 和 post,分别说下吧。(一)get 提交 1.首先说下客户端(浏览器)的 form 表单用 get 方法是如何将数据编码后提交给服务器端的吧。 对于 get 方法来说,都是把数据串联
4、在请求的 url 后面作为参数,如:http:/localhost:8080/servlet?msg=abc (很常见的一个乱码问题就要出现了,如果 url 中出现中文或其它特殊字符的话,如:http:/localhost:8080 /servlet?msg=杭州,服务器端容易得到乱码) ,url 拼接完成后,浏览器会对 url 进行 URL encode,然后发送给服务器,URL encode 的过程就是把部分 url 做为字符,按照某种编码方式(如:utf-8,gbk 等)编码成二进制的字节码,然后每个字节用一个包含 3 个字符的字符串 “%xy“ 表示,其中 xy 为该字节的两位十六进制
5、表示形式。我这里说的可能不清楚,具体介绍可以看下 .URLEncoder类的介绍在这里。了解了 URL encode 的过程,我们能看到 2 个很重要的问题,第一:需要 URL encode 的字符一般都是非 ASCII 的字符(笼统的讲) ,再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行 URL encode,所以对于我们来说,都是英文字母的 url 不会出现服务器得到乱码问题,出现乱码都是 url 里面带了中文或特殊字符造成的;第二:URL encode 到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用
6、GBK,通过设置浏览器也可以使用 UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把 url 里面的中文或特殊字符用 javascript 做 URL encode,然后再拼接 url 提交数据,也就是替浏览器做了 URL encode,好处就是网站可以统一 get 方法提交数据的编码方式。 完成了 URL encode,那么现在的 url 就成了 ASCII 范围内的字符了,然后以 iso-8859-1 的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的是,对于 get 方法来说,没有请求实体,含有数据的 url 都在请求头里面,之
7、所以用 URL encode,我个人觉的原因是:对于请求头来说最终都是要用 iso-8859-1 编码方式编码成二进制的 101010.的纯数据在互联网上传送,如果直接将含有中文等特殊字符做 iso-8859-1 编码会丢失信息,所以先做 URL encode 是有必要的。 2。服务器端(tomcat)是如何将数据获取到进行解码的。 第一步是先把数据用 iso-8859-1 进行解码,对于 get 方法来说,tomcat 获取数据的是 ASCII 范围内的请求头字符,其中的请求 url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是 URL encode 后的%XY 状态,先停下,我
8、们先说下开发人员一般获取数据的过程。通常大家都是request.getParameter(“name“)获取参数数据,我们在 request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,这里要说下,有很多新手说用 request.setCharacterEncoding(“字符集“)可以指定解码方式,其实是不可以的,看 servlet 的官方 API 说明有对此方法的解释:Overrides the name of the character encoding used in the body of this request. This method must be calle
9、d prior to reading request parameters or reading input using getReader().可以看出对于 get 方法他是无能为力的。那么到底用什么编码方式解码数据的呢,这是 tomcat 的事情了,默认缺省用的是 iso-8859-1,这样我们就能找到为什么 get 请求带中文参数为什么在服务器端得到乱码了,原因是在客户端一般都是用 UTF-8 或 GBK 对数据 URL encode,这里用 iso-8859-1 方式 URL decoder 显然不行,在程序里我们可以直接 Java代码 1. new String(request.ge
10、tParameter(“name“).getBytes(“iso-8859-1“),“客户端指定的 URL encode 编码方式“) 还原回字节码,然后用正确的方式解码数据,网上的文章通常是在tomcat 里面做个配置 Xml 代码 1. 这样是让 tomcat 在获取数据后用指定的方式 URL decoder,URL decoder 的介绍在这里 (一)post 提交 1.客户端(浏览器)的 form 表单用 post 方法是如何将数据编码后提交给服务器端的。 在 post 方法里所要传送的数据也要 URL encode,那么他是用什么编码方式的呢? 在 form 所在的 html 文件里
11、如果有段,那么 post 就会用此处指定的编码方式编码。一般大家都认为这段代码是为了让浏览器知道用什么字符集来对网页解释,所以网站都会把它放在html 代码的最前端,尽量不出现乱码,其实它还有个作用就是指定 form 表单的post 方法提交数据的 URL encode 编码方式。从这里可以看出对于get 方法来数,浏览器对数据的 URL encode 的编码方式是有浏览器设置来决定, (可以用 js 做统一指定) ,而 post 方法,开发人员可以指定。 2。服务器端(tomcat)是如何将数据获取到进行解码的。 如果用 tomcat 默认缺省设置,也没做过滤器等编码设置,那么他也是用 is
12、o-8859-1 解码的,但是 request.setCharacterEncoding(“字符集“)可以派上用场。 我发现上面说的 tomcat 所做的事情前提都是在请求头里没有指定编码方式,如果请求头里指定了编码方式将按照这种方式编码。 有 2 篇文章推荐下,地址分别是 深入浅出 URL 编码:http:/ 表单用 post 方法提交数据时乱码问题:http:/ 用 post 很重要的在 form 所在的 html 文件里如果有段 强烈建议使用 post 提交 GET 和 POST 两种方法都是将数据送到服务器,但你该用哪一种呢? HTTP 标准包含这两种方法是为了达到不同的目的。POST
13、 用于创建资源,资源的内容会被编入 HTTP 请示的内容中。例如,处理订货表单、在数据库中加入新数据行等。 当请求无副作用时(如进行搜索) ,便可使用 GET 方法;当请求有副作用时(如在数据库添加数据行) ,则用 POST 方法。一个比较实际的问题是:GET方法可能会产生很长的 URL,或许会超过某些浏览器与服务器对 URL长度的限制。 若符合下列任一情况,则用 POST 方法: 请求的结果有持续性的副作用,例如,数据库内添加新的数据行。 若使用 GET 方法,则表单上收集的数据可能让 URL 过长。 要传送的数据不是采用 7 位的 ASCII 编码。 若符合下列任一情况,则用 GET 方法
14、: 请求是为了查找资源,HTML 表单数据仅用来帮助搜索。 请求结果无持续性的副作用。 收集的数据及 HTML 表单内的输入字段名称的总长不超过 1024 个字符。表单提交中 Get 和 Post 方式的区别1. get 是从服务器上获取数据,post 是向服务器传送数据。2. get 是把参数数据队列加到提交表单的 ACTION 属性所指的URL 中,值和表单内各个字段一一对应,在 URL 中可以看到,因此安全性不高。post 是通过 HTTP post 机制,将表单内各个字段与其内容放置在 HTML HEADER 内一起传送到 ACTION 属性所指的 URL 地址。用户看不到这个过程,安
15、全性比较高。3. 对于 get 方式,服务器端用 Request.QueryString 获取变量的值,对于 post 方式,服务器端用 Request.Form 获取提交的数据。4. get 传送的数据量较小,不能大于 2KB。post 传送的数据量较大,一般被默认为不受限制。但理论上,IIS4 中最大量为80KB,IIS5 中为 100KB。5. get 安全性非常低,post 安全性较高。6. post 页面不能被加入收藏夹中,get 页面可以被加入。ContentType 和 Form 中 enctype 属性的相对应,它是 Form 用来组织数据的方式,主要包含了两种:1、appli
16、cation/x-www-form-urlencoded:它是默认内容类型(content type) ,在结果中我们已经看到了经它编码的数据的效果。编码方法:i.将空格使用“+”代替,非字母和数字字符,是用以%HH 表示的该字符的ASCII 代替(汉字就是这种形式) ;ii.变量和值使用“=” ,各个变量和值对之间使用“&”连接。2、multipart/form-data:它可以用来传输大量二进制数据或者非ASCII 字符的文本,因此在上传文件需设置enctype=“multipart/form-data“,此时method 必须为 post。它传输的消息包含了一系列的数据块,每一块都代表 Form 中的一个变量,并且数据块的顺序和页面上的顺序一致,块与块之间使用特殊字符(boundary)分隔。如果 Form 中包含 file 控件,相应的数据块还会包含一个 Content-Type 头,用来指定 MIME,默认值为 text/plain。下面是设置 enctype=“multipart/form-data“时 content 的结果: