http请求中文乱码的原因分析(个人理解,未必正确)

url(也就是网址)肯定会使用iso8859-1编码成字节数组,这是http协议规定的。这些字节数组传到tomcat之后,tomcat也会按照iso8859-1对网址进行解码成字符串。

tomcat也会有url解码方式(默认也是iso8859-1,tomcat8.0之前,之后默认是utf-8),tomcat将字节数组转换成字符串之后,如果发现字符串里面(也就是网址)有url编码的参数,它也会使用默认的url解码字符集进行解码。此时就有可能乱码。因为浏览器对url里面的参数进行url编码使用的字符集不一定是iso8859-1。

要区分2种情况,一种是把字节数组转换成字符串的过程,一种是对转换之后的字符串里面url编码的部分(比如说参数部分,有中文的情况下)进行还原。

解决方法一:

String userName = request.getParameter("userName");

String passWord = request.getParameter("password");

//get请求请求参数是在请求行里面

userName = new String(userName.getBytes("iso8859-1"), "gbk");

passWord = new String(passWord.getBytes("iso8859-1"), "gbk");

解决方法二:

在tomcat的conf/server.xml里面设置URIEncoding和页面url编码设置成一样。不过这样会影响tomcat里面所有的webapp

    

    
 
    

以上说的是GET部分

 

------------------------------------------------------------------------------------------------------------------------------------------------------------

以下说的POST部分

post请求就不涉及url编解码的问题了。只有字符串转字节数组和字节数组转字符串。页面上是字符串转字节数组,webapp里面是字节数组转字符串。

解决方法:

//设置请求实体的解码方式

request.setCharacterEncoding("utf-8");//将请求实体的解码方式设置成页面的编码方式即可

String userName = request.getParameter("userName");

String passWord = request.getParameter("password");

 

 

 

tomcat8的官方文档说明

官方文档 (https://tomcat.apache.org/tomcat-8.0-doc/config/http.html) 中是这么说的:

    URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, UTF-8 will be used unless the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true in which case ISO-8859-1 will be used.
 

 

你可能感兴趣的:(javaweb)