tomcat在接收到请求后的编码问题处理
乱码问题的产生
在浏览器向服务器发送请求参数的过程中,浏览器以什么编码打开的表单页面,就用什么编码来发送这个页面提交的数据。
而在服务器接收请求参数的时候,如果处理请求参数使用的编码方式与浏览器发送请求参数时使用的编码方式不一致,就会产生乱码问题。
乱码问题的解决
POST请求
在测试中发现,tomcat服务器默认以ISO8859-1的编码解析数据,因此如果需要在参数中解析中文,需要设置
request.setCharacterEncoding("utf-8");
明确的通知服务器以浏览器发送过来的编码解析数据,如果浏览器是utf-8的编码,就以utf-8的编码解析数据,这样就就解决了POST请求中的乱码问题。
GET请求
对于get请求提交的数据,在不同版本的tomcat中有不同的处理方式,在tomcat8及以上的版本,服务器默认以utf-8的编码方式处理请求参数,这一点可以从tomcat8官方文档中可以看出
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.
而对于tomcat8以下的版本,服务器会默认以ISO8859-1的编码方式处理请求参数,在tomcat7官方文档中可以看出
URIEncoding: This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
因此在tomcat8及以上版本的tomcat服务器中,如果浏览器页面是utf-8编码,就不用设置get请求的请求参数编码处理方式,服务器默认就会用utf-8的方式处理请求参数,而在tomcat8以下的tomcat服务器中,需要我们手动编解码处理请求参数,如下所示。
String username = request.getParameter("username");
username = new String(username.getBytes("iso8859-1"),"utf-8");
另外,在tomcat目录下的/conf中的server.xml中我们也可以手动配置tomcat默认的编码方式,在
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
这段代码中添加一个URIEncoding参数,可以配置tomcat的默认编码方式。
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>