JavaWeb项目的中文乱码的原因以及Servlet中处理GET请求和POST请求编码过滤器-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

JavaWeb项目的中文乱码的原因以及Servlet中处理GET请求和POST请求编码过滤器

简介:

一、乱码原因

①传输方和接收方采用的编码不一致。传输方对参数采用的是UTF-8编码而接收方却用GBK进行解析,当然是乱码。

②Tomcat服务器默认采用的ISO8859-1编码得到参数值。虽然①中采用了同样的编码方式,但经过tomcat一处理,也会出现乱码(GET方式)

 


二、解决办法

方法一 每次传输都手动设置编码(GET方式传输数据)

传输方
String name = URLEncoder.encode("徐越","UTF-8");
String path = "
http://localhost:8008/xyWeb/xyServlet?name=" + name;

接收方
String name = new String(request.getParameter("name").getBytes("ISO8859-1","UTF-8"));

若传输方默认采用UTF-8编码就没有必要每次写,但接收方每次都写太烦,可考虑过滤器。

 

方法二(过滤器)


  1. /**  
  2.  * 编码过滤器  
  3.  *   
  4.  * @author 徐越  
  5.  *   
  6.  */ 
  7. public class EncodingFilter implements Filter  
  8. {  
  9.     private String encoding;  
  10.  
  11.     public void init(FilterConfig fConfig) throws ServletException  
  12.     {  
  13.         encoding = fConfig.getInitParameter("encoding");  
  14.     }  
  15.  
  16.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws Exception  
  17.     {  
  18.         HttpServletRequest httprequest = (HttpServletRequest) request;  
  19.         if ("GET".equals(httprequest.getMethod()))  
  20.         {  
  21.             // 将httpRequest进行包装  
  22.             EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(httprequest, encoding);   
  23.             chain.doFilter(wrapper, response);  
  24.         }  
  25.         else 
  26.         {  
  27.             request.setCharacterEncoding(encoding);  
  28.             response.setContentType("text/html;charset=" + encoding);  
  29.             chain.doFilter(request, response);  
  30.         }  
  31.     }  
  32.  
  33.     public void destroy()  
  34.     {  
  35.  
  36.     }  
  37.  
  38. }  
  39.  
  40.  
  41. /**  
  42.  * httpRequest进行包装类  
  43.  *   
  44.  * @author 徐越  
  45.  *   
  46.  */ 
  47. public class EncodingHttpServletRequest extends HttpServletRequestWrapper  
  48. {  
  49.     private HttpServletRequest request;  
  50.     private String encoding;  
  51.  
  52.     public EncodingHttpServletRequest(HttpServletRequest request)  
  53.     {  
  54.         super(request);  
  55.         this.request = request;  
  56.     }  
  57.  
  58.     public EncodingHttpServletRequest(HttpServletRequest request,String encoding)  
  59.     {  
  60.         super(request);  
  61.         this.request = request;  
  62.         this.encoding = encoding;  
  63.           
  64.     }  
  65.     @Override 
  66.     public String getParameter(String name)  
  67.     {  
  68.         String value = request.getParameter(name);  
  69.         if (null != value)  
  70.         {  
  71.             try 
  72.             {  
  73.                 // tomcat默认以ISO8859-1处理GET传来的参数。把tomcat上的值用ISO8859-1获取字节流,再转换成UTF-8字符串  
  74.                 value = new String(value.getBytes("ISO8859-1"), encoding);  
  75.             }  
  76.             catch (UnsupportedEncodingException e)  
  77.             {  
  78.                 e.printStackTrace();  
  79.             }  
  80.         }  
  81.         return value;  
  82.     }  
  83.  

  1. <filter> 
  2.   <display-name>EncodingFilter</display-name> 
  3.   <filter-name>EncodingFilter</filter-name> 
  4.   <filter-class>cn.xy.filter.EncodingFilter</filter-class> 
  5.   <init-param> 
  6.     <description></description> 
  7.     <param-name>encoding</param-name> 
  8.     <param-value>UTF-8</param-value> 
  9.   </init-param> 
  10. </filter> 
  11. <filter-mapping> 
  12.   <filter-name>EncodingFilter</filter-name> 
  13.   <url-pattern>/*</url-pattern> 
  14. </filter-mapping> 
本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1089295如需转载请自行联系原作者

woshixuye111

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章
最新文章
相关文章