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

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

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

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

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

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		String foo=arg0.getParameter("foo");
		System.out.println(foo);
		arg2.doFilter(arg0, arg1);
	}
 

 

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

URLEncoder.encode("中国","GBK")

 

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

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

URLDecoder.decode("%D6%D0%B9%FA","ISO-8859-1");

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

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

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

	@GET
	@Path("/test")
	public void hello10(@QueryParam(value="foo") String foo) {
		System.out.println(foo);

	}	

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

 

String params=request.getQueryString();
System.out.println(params);//foo=%D6%D0%B9%FA
String encodedParams= URLDecoder.decode(params,"UTF-8");
......

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

3.总结

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

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

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

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

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

 

 

你可能感兴趣的:(tomcat,servlet,编码)