搜索
查看: 1053|: 0

Get和Post请求详解

[复制链接]

322

主题

0

回帖

1208

积分

网站编辑

积分
1208
发表于 2014-7-24 09:23:06 | 显示全部楼层 |阅读模式

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 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技术需要使用随机数的原因。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

大数据中国微信

QQ   

版权所有: Discuz! © 2001-2013 大数据.

GMT+8, 2024-12-24 00:43 , Processed in 0.051569 second(s), 24 queries .

快速回复 返回顶部 返回列表