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