GET方式传递中文参数时乱码问题分析

这几天在研究resteasy框架的使用,在测试通过GET方式传递中文参数时出现乱码问题。

经过分析,使我对TOMCAT的处理机制和HttpServletRequest有了更加深入的认识。

1.filter过滤器中获取参数值出现乱码

下面是服务器端中的过滤器获取参数的代码:

Java代码   收藏代码
  1. public void doFilter(ServletRequest arg0, ServletResponse arg1,  
  2.         FilterChain arg2) throws IOException, ServletException {  
  3.     String foo=arg0.getParameter("foo");  
  4.     System.out.println(foo);  
  5.     arg2.doFilter(arg0, arg1);  
  6. }  
 

 

    当我在浏览器输入“http//:localhost:8080/rest/test?foo=中国”时,浏览器会自动对"中国"进行URI转码,由于使用的中文语言环境,浏览器会将“中国”转码为"%D6%D0%B9%FA"."D6D0","B9FA"分别"中","国"的GBK编码。等价于在JAVA语言中作了如下操作

Java代码   收藏代码
  1. URLEncoder.encode("中国","GBK")  

 

传递到服务器后的URL实际为“http//:localhost:8080/rest/test?foo=%D6%D0%B9%FA”。

    由于TOMCAT默认会对URL进行解码,并且使用的是ISO-8859-1字符集,如下所示

Java代码   收藏代码
  1. URLDecoder.decode("%D6%D0%B9%FA","ISO-8859-1");  

 因为编码和解码使用的是不同的字符集,所以解码出来的字符串肯定是不对的,故而使用如下方式获取参数值时出现乱码。

Java代码   收藏代码
  1. String foo=request.getParameter("foo");  

 2.resteasy的service方法中获取参数出现乱码

Java代码   收藏代码
  1. @GET  
  2. @Path("/test")  
  3. public void hello10(@QueryParam(value="foo") String foo) {  
  4.     System.out.println(foo);  
  5.   
  6. }     

 resteasy中获取到request参数foo的机制与前面的filter略有不同。foo参数的是值由resteasy框架进行类似如下处理后获得的。

 

Java代码   收藏代码
  1. String params=request.getQueryString();  
  2. System.out.println(params);//foo=%D6%D0%B9%FA  
  3. String encodedParams= URLDecoder.decode(params,"UTF-8");  
  4. ......  

 通过getQueryString()方式获得的参数并没有被TOMCAT解码过,但被resteasy框架进行了解码,当传入参数不是以UTF-8编码的话获取到的参数就可能是乱码

3.总结

使用request.getParameter方式获得的参数是已经经过web服务器解码的

使用request.getQueryString可以获得未解码的原始参数

对于tomcat解码造成的乱码问题可以通过2种途径解决

         修改tomcat配置文件设置解码方式

         服务器端对于获取到的参数进行new String(param.getBytes("ISO-8859-1"),"页面指定编码")转换


转自:http://wq-pro.iteye.com/blog/1261444

你可能感兴趣的:(GET方式传递中文参数时乱码问题分析)