关于处理GET方式提交的含有特殊字符的参数

时间:2023-01-06 12:53:59

一、问题

下面是session失效拦截后重定向代码

String requestUri = request.getRequestURI();
String contextPath = request.getContextPath();
String url = requestUri.substring(contextPath.length());
response.sendRedirect((new StringBuilder(String.valueOf(contextPath))).append("/sys/main/framelogin?fromurl=").append(response.encodeRedirectUrl((new StringBuilder(String.valueOf(requestUri))).append("?").append(StrUtils.GetString(request.getQueryString())).toString())).toString());

重定向的完整url地址如下

/xxx/sys/main/framelogin?fromurl=/gyl/bxgl/form?edit_type=edit&id=1

当重定向到framelogin所在的framelogin方法时

 public ModelAndView framelogin(HttpSession session, HttpServletRequest request, String fromurl, String yhgh)
{
ModelAndView mv = new ModelAndView("/sys/login/framelogin");
mv.addObject("fromurl", fromurl);
mv.addObject("menuid", request.getParameter("menuid"));
return mv;
}
fromurl只能获取到/gyl/bxgl/form?edit_type=edit,&后面的参数无法获取

二、解决方法

在重定向时将特殊字符进行转码 

URLEncoder.encode(StrUtils.GetString(request.getQueryString()), "UTF-8")

转码标准如下:

字符 特殊字符的含义 URL编码
# 用来标志特定的文档位置 %23
% 对特殊字符进行编码 %25
& 分隔不同的变量值对 %26
+ 在变量值中表示空格 %2B
\ 表示目录路径 %2F
= 用来连接键和值 %3D
? 表示查询字符串的开始 %3F


顺带再把get和post请求的区别复习一下:

1.    Get方法长度限制

Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。

如:IE对URL长度的限制是2083字节(2K+35)。

下面就是对各种浏览器和服务器的最大处理能力做一些说明.

Microsoft Internet Explorer (Browser)

IE浏览器对URL的最大限制为2083个字符,如果超过这个数字,提交按钮没有任何反应。

http://support.microsoft.com/default.aspx?scid=kb;EN-US;q208427 
Firefox (Browser)

对于Firefox浏览器URL的长度限制为65,536个字符。

Safari (Browser)

URL最大长度限制为 80,000个字符。

Opera (Browser)

URL最大长度限制为190,000个字符。

Google (chrome)

URL最大长度限制为8182个字符。

Apache (Server)

能接受最大url长度为8,192个字符。

Microsoft Internet Information Server(IIS)

能接受最大url的长度为16,384个字符。

通过上面的数据可知,为了让所有的用户都能正常浏览, URL最好不要超过IE的最大长度限制(2083个字符),当然,如果URL不直接提供给用户,而是提供给程序调用,这时的长度就只受Web服务器影响了。

注:对于中文的传递,最终会为urlencode后的编码形式进行传递,如果浏览器的编码为UTF8的话,一个汉字最终编码后的字符长度为9个字符。

因此如果使用的 GET 方法,最大长度等于URL最大长度减去实际路径中的字符数。

2.    POST方法长度限制

理论上讲,POST是没有大小限制的。HTTP协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力。

如:在Tomcat下取消POST大小的限制(Tomcat默认2M);

打开tomcat目录下的conf目录,打开server.xml 文件,修改

<Connector

debug="0"

acceptCount="100"

connectionTimeout="20000"

disableUploadTimeout="true"

port="8080"

redirectPort="8443"

enableLookups="false"

minSpareThreads="25"

maxSpareThreads="75"

maxThreads="150"

maxPostSize="0"

URIEncoding="GBK"

</Connector>

增加红色字体部分 maxPostSize="0" (设为0是取消POST的大小限制)