GET POST 提交时编码流程

原创
2015/04/03 18:45
阅读数 511

    今天在 Linux(语言en,编码utf-8)环境下进行测试,发现GET请求数据,后台通过 String value = request.getParameter("name") 获取的值为乱码,可是如果使用post方式提交,则不会发生乱码情况!

对于GET方式,可以采用 : new String(value.getBytes("iso8859-1"),"utf-8");

    那么问题来了,GET方式与POST到底有什么区别呢?

1、Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是统一资源定位,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。其实这就是Restful的简单解释。


2、GET 在 HTTP 中这样定义的:

    1)安全的:只是查询信息,不会对信息进行修改

    2)幂等的:相同的参数查询,任何时候都是得到同样的结果

3、POST在HTTP 中这样定义的:

    1)不安全的:修改数据


4、GET方式请求数据时,参数的长度是有限制的(说url长度是受限制的更合理),其实这个限制不是HTTP规范规定,而是浏览器和服务器自身规定!一般都是1-2kb。

5、POST方式请求数据,参数长度是不受限制的,如果受限,那么文件上传就无法解决了,但是如果你在url后面附带参数,那么拼接的url长度是受限的,因为这部分参数实质是POST请求。

6、GET方式请求时,参数会负载在浏览器的地址栏上,那么是很不安全的,因为这些数据实质是可读的(网络编码),而且浏览器会缓存这些历史记录,因此,GET方式是不安全的。

关于GET编码流程

1)在jQuery.ajax 中有一个type可以设置为提交方式,我们设置为GET,然后我们还可以设置contentType,即提交给服务器的编码方式,我们可以设置为:contentType:'application/x-www-form-urlencoded; charset=utf-8',这个的作用就是,把数据传输到服务器时,服务器的编码方式为utf-8,但是我在测试当中发现,这个设置是不起作用的。实际编码还是系统的默认编码。那么,GET请求流程是这样的:

首先:jQuery.ajax , 提交请求,浏览器会把参数转为网络编码(%byte1%byte2%byte3),也就是用%分割的UTF-8编码,这个可以采用js方法urlEncode替代。参数编码好之后,用?和&符号拼接在url后面,同时包装好请求头,也就是刚才的contentType内容等,一并发送给服务器(Tomcat),Tomcat会对网络编码进行解码(这里是GET请求乱码的根源),关键是解码成哪种格式?默认情况下,他是根据服务器设置的默认编码格式,可能是UTF-8 可能是ISO-8859-1,具体不是很清楚,当然,我们可以修改默认值,在server.xml中修改,如下:

<connector port="8080"

    redirectPort="8443"

    connectionTimeout="20000"

    URIEncoding="UTF-8"/> 

这个时候,就会转为utf-8编码,那么他其实编码与contentType没有关系,不过contentType的值可以从这里获取:

String charset = request.getCharacterEncoding();

服务器把网络编码转换完之后,那么Servlet就可以通过 request.getParameter()获取了,获取的字符就是之前服务器转码之后的,很多人在这一步乱码,原因就是:服务器解码时不知道应该为哪种编码导致,所以问题解决方式,自然大家也知道了,采用上面的配置就可以了。当然,看了整个流程,可能你还想到这样避免乱码,就是手动字符串转码,如下:

String value = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

这种方式其实是错误的,因为Java是跨平台的,那么一个web可以在多平台运行,换了一个服务器可能它采用的编码方式就不一样,那么这种方式就不行了,何况采用这种方式也要知道服务器是采用什么编码方式。

另外,要纠正一下Servlet API的使用,很多人通过如下方式来解决GET乱码问题:

request.setCharacterEncoding("UTF-8");

这个设置对于GET请求是毫无用处的,它用于POST请求。

关于POST编码流程

1)在jQuery.ajax 中同样可以设置提交方式为POST,但是contentType已经没有用了,提交类型采用默认的contentType:'application/x-www-form-urlencoded; charset=utf-8',编码格式是固定UTF-8的,不过同样服务器对网络编码进行解码和转为默认编码格式给Servlet,这个时候,就可以通过设置request.setCharacterEncoding("UTF-8");来控制服务器编码,这样就不会乱码了。通过POST请求流程可以得到一个启发,就是为了避免GET请求乱码,可以把GET改为POST请求方式。另外,说明一点,如果是上传的话,那么参数是流的新式传输,那个时候ContentType需要这么设置:multipart/form-data

总结起来,GET与POST的差异就是如下几点了:

1)GET请求会把参数附带在URL上,而POST是放在包体中发送

2)GET方式的URL是在浏览器的地址栏中可见的,POST是不可见的

3)GET方式的URL可以被浏览器作为历史记录缓存,作为书签收藏,POST方式不行

4)GET方式会缓存数据,POST不会

5)GET方式不能上传,POST可以

6)GET方式的URL参数长度是受限的,POST不受限制


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部