一.HttpServletRequest的乱码问题
1.HttpServletRequest的请求分为GET与POST请求,GET与POST请求的附带的参数的位置不相同,所以两者的处理的方法并不相同。
①GET请求
GET请求的参数会附带在请求的url地址之后,Tomcat服务器接收之后默认使用ISO-8859-1编码进行解析,所以我们得到的中文参数会乱码。
举例:
当我们点击encoding.html中的GET的a标签,客户端会向服务器发送一个get请求,我们可以通过浏览器的开发者工具查看到。
我们再去看我们的后台,可以看到如下乱码:
所以我们可以通过代码将tomcat用ISO-8859-1编码得到的字符串乱码转为UTF-8编码,所以在servlet中加入两行代码即可。
再次点击encoding.html中的超链接,可以看到正确的结果。
②POST请求
POST请求会将附带的参数添加到http的请求体中,若不"告诉"tomcat用什么编码进行解析,默认仍然使用ISO-8859-1编码,所以我们得到的参数值仍然会乱码。
在encoding.html中两个表单域填写李四和456,点击提交按钮,我们可以查看后台得到的乱码。
处理POST请求的乱码,我们可以通过request对象的setCharacterEncoding方法"告诉"tomcat去拿请求体的参数用UTF-8编码进行解析。
我们再次在encoding.html中两个表单域填写李四和456,点击提交按钮,可以看到正确编码的参数值了。
这里会有个疑问,就是为什么get请求处理乱码不能像post一样"告诉"tomcat用UTF-8编码进行解析?因为request对象并没有提供这样方法"告诉"tomcat用UTF-8编码去解析url地址中的参数。(不过我们可以在tomcat目录下的conf目录中的server.xml配置文件中的http连接器Connector的属性中添加URLEncoding="UTF-8",这样tomcat默认就是UTF-8编码进行解析url中参数,但这种方法不常用,因为移植性不好。)
二.HttpServletResponse的乱码问题
HttpServletResponse的乱码问题很简单,只需在通过response对象获取输出流(Writer,OutputStream)之前,通过response对象的setContentType方法,比如response.setContentType("text/html;charset=UTF-8");这样通过response对象输出到客户端的中文就不会乱码了。