Get和Post请求详解


1.请求长度
        RFC对于Get和Post请求并没有长度的限制。
        但是浏览器有限制,比如IE浏览器Get请求不能超过2083个字符,而火狐浏览器不能超过65536个字符。浏览器对于Post请求则没有限制。
 
        服务器对Get和Post请求可以进行限制,以Tomcat为例,Connector中的maxHttpHeaderSize限制了Get请求的长度,而maxPostSize则可以限制Post请求的长度。由此可见两种请求的区别,get请求在Http Header部分,而Post请求在Http Body部分。
 
2.编码
        Spring的CharacterEncodingFilter和request的setCharacterEncoding仅仅针对Http Body,这两种方式对于Get请求不起作用。
        以Tomcat为例,可以调整URIEncoding参数或者启用useBodyEncodingForURI来调整Get请求的编码。URIEncoding默认是ISO-8859-1编码。
        当然,这种方式不具通用性,需要修改中间件的配置。
        还有一种方法,在前台页面通过JS对中文进行两次编码。
        以如下前台页面为例,将两次编码的中文数据提交到后台Servlet。
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <script language='javascript'>
    function get(){
        var data='中文请求';
        data=encodeURIComponent(encodeURIComponent(data));
        document.getElementById("a").href="http://127.0.0.1:8080/Web/Encoding?name="+data;
 }
 </script>
 </head>
 <body>
 <a onClick="get()" id="a">Click<a/>
 </body>
 </html>
 
Servlet解码一次,即可得到中文数据。
 String name = URLDecoder.decode(request.getParameter("name"),"utf-8");

以"中文请求"为例
 前台JS第一次编码的结果:%E4%B8%AD%E6%96%87%E8%AF%B7%E6%B1%82
 前台JS第二次编码的结果:%25E4%25B8%25AD%25E6%2596%2587%25E8%25AF%25B7%25E6%25B1%2582
        在第一次编码之后,数据已经都是ASCII字符,所以二次编码就是将第一次编码中的"%"进一步编码为"%25"
        请求到达Tomcat之后,Tomcat会根据URIEncoding自动解码(默认为ISO-8859-1),所以在进入Servlet的doGet方法之前,数据已经还原为
        “%E4%B8%AD%E6%96%87%E8%AF%B7%E6%B1%82”
        故最后使用String name = URLDecoder.decode(request.getParameter("name"),"utf-8");就可以得出正确的数据。
        这种方式的好处是不用修改中间件的配置。缺点是两次编码会导致URL膨胀。
 
3.缓存内容
        浏览器会缓存get请求的结果直至过期,这也是JSONP技术需要使用随机数的原因。

本文永久更新链接地址:

相关内容

    暂无相关文章