IE兼容 请求参数中文乱码或请求无效 转义与转码

要解决发送请求包含中文参数,且还要兼容IE浏览器,需要针对不同场景采用对应的方法来处理

概括为以下2种场景:

应用场景一:a标签href请求

<%
	String str1 = "参数1"; //中文
	String str2 = "参数2"; //中文
%>
<a href="YourController/function1?param1="+str1+"¶m2="+str2 >点我跳转到Controller的function1方法 </a>
<a href="YourPage/page1.jsp?param1="+str1+"¶m2="+str2 >点我跳转到YourPage目录下的page1.jsp页面</a>

以上情况,在谷歌浏览器下,如果不对编码进行任何处理,中文是可行的,但是!在IE浏览器下,是绝对行不通的。
对应的解决办法则是:转义
这里简述转义的概念:

web 开发中通过问号(?)方式在浏览器地址栏中传值时。浏览器是通过“&”来区分问号后的参数个数的。 如果出现传值参数中带有“&”时,在接受页面就会出现错误,类似如下请求路径:/next.jsp?param1=hendhs89&furej & param2=sss
参数param1中含有转义字符“&” ,这样会导致被请求页的参数接收错误。
在传值前 通过 java.net.URLEncoder.encode(param1) 编码处理后,可将转义字符转为16进制;
1. + URL 中+号表示空格 %2B
2. 空格 URL中的空格可以用+号或者编码 %20
3. / 分隔目录和子目录 %2F
4. ? 分隔实际的 URL 和参数 %3F
5. % 指定特殊字符 %25
6. # 表示书签 %23
7. & URL中指定的参数间的分隔符%26
8. = URL中指定参数的值 %3D
9. ! URL中指定参数的值 %21

上面提到的 java.net.URLEncoder.encode(param1) 方法,是jsp页面转义的,当然我更提倡使用javascript的转义方法:encodeURI()
发送示例:

<%
	String str1 = "参数1"; //中文
	String str2 = "参数2"; //中文
%>
<a href="YourController/function1?param1="+encodeURI("<%=str1%>")+"¶m2="+encodeURI("<%=str2%>") >点我跳转到Controller的function1方法 </a>
<a href="YourPage/page1.jsp?param1="+encodeURI("<%=str1%>")+"¶m2="+encodeURI("<%=str2%>") >点我跳转到YourPage目录下的page1.jsp页面</a>

接收示例(从URL中取,而不是从parameter里取!):

<%
	String query = request.getQueryString();
	String str1 = query.split("&")[0].split("=")[1];
	String str2 = query.split("&")[1].split("=")[1];
 	String str1 = java.net.URLDecoder.decode(str1,"utf-8");
 	String str2 = java.net.URLDecoder.decode(str2,"utf-8");
%>

应用场景二:ajax的get请求

ajax的get请求则是从parameter里取出得到,乱码原因则是因为前端发送与后端接收的编码不同导致
对应的解决办法则是:转码(转编码)
编码含义就不仔细介绍了,常用的UTF-8编码:

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到4个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。
含中文页面通常使用的是UTF-8编码,用URL传递到后台则需要ISO8859-1转UTF-8,浏览器get请求带参造成的。

前端页面:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<a href="YourController/function?str3=中文"></a>

后台方法:

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

处理后的str3则是正确的中文。

总结:在解决带参跳转问题时,如果是ajax,能使用post的尽量不使用get,post是将参数存在消息主体里的,并且是经过编码的,服务器通常是根据请求头headers中的Content-Type字段来获知请求中的消息主体是何种编码,再对主体进行解析,则不用再处理。若不得不用get请求,如a标签,或ajax的get请求,则尽量使用转义,在暴露带参的url时,经过转义的参数也更安全,在接收的时候,再进行解转义的操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章