servlet get请求中文参数乱码

来源:互联网 发布:美国网络实名制吗 编辑:程序博客网 时间:2024/05/18 02:51
今天无意中突然对get请求时中文乱码的解决方法有了兴趣,以前只是会用,却不知道其中的原理,于是自己研究了一番,先来看后台代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubPrintWriter pw = response.getWriter();pw.append("getContextPath: ").append(request.getContextPath()).append("\n");pw.append("getServletPath: ").append(request.getServletPath()).append("\n");pw.append("getRealPath: ").append(request.getServletContext().getRealPath("/")).append("\n");pw.append("getRequestURI: ").append(request.getRequestURI()).append("\n");pw.append("getRequestURL: ").append(request.getRequestURL()).append("\n");}


第一种请求方式:
直接在地址栏中输入:http://localhost:8080/test/HTTPTestServlet?name=中文
那么返回的结果是:

数据解析编码:指的是html页面form表当数据提交时候的编码方式,这个编码方式和页面编码是统一的,这里设置为UTF-8,GET请求的的请求数据,并不在请求体体中,而是在请求行中的?之后。而整个请求数据,包括请求行,请求头,请求体都会通过http协议发送到服务端去处理。(HTTP协议时不支持中文的,默认编码:ISO8859-1)
对比post请求,post请求的的请求数据都包含在请求体中,当发送了了服务端的时候,通过设置request.setCharacterEncoding("UTF-8"),就能够使得数据传输到服务端的时候,能够将其解析成utf-8的数据。
但是,这样的设置编码的操作对请求行中的数据缺失无效的。
前面说了数据时通过http协议的方式发送到服务端,而请求行的信息(原始状态下是UTF-8编码)经过http协议进行传输的时候,http协议对其进行了默认编码的编码操作。并发送到了服务端,而服务端类似post请求的处理方式,对其有没有作用。

(乱码产生的核心本质:源编码和读取显示的编码不一致)
思路:找到源编码的二进制,然后重新用UTF-8进行解码就可以了。

所以这种方式可以解决问题:String name1 = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
而第二种和第三种输出的还不是UTF-8的编码方式,所以仍然乱码。


第二种请求方式:
将中文进行两次encodeURI,地址栏中直接输入:
http://localhost:8080/test/HTTPTestServlet?name=%25e4%25b8%25ad%25e6%2596%2587,name参数进行了两次uri编码
返回结果:

只有name2可以正常显示中文,也就是请求时进行了两次encodeURI的那个显示出来了中文,为什么请求的时候要编码两次那?这是因为在调用getParameter的时候会调用一次decode,这个decode不管用的什么字符集(utf-8,iso-8859-1,gbk),都可以得到utf-8的三个字节,在获取到参数后,再进行decode一次,就获取到页面请求的中文啦。

还有一种解决get请求乱码的方法,是修改tomcat的URIEncoding为UTF-8
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />

maven的tomcat插件配置uriEncoding
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/test</path>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
</plugin>
0 0