Get、Post请求中文乱码问题

转载自:https://www.cnblogs.com/binye-typing/p/6281627.html

最近在重温JavaWeb基础内容,碰到了之前也时常遇到的中文乱码问题,想着反正是经常要处理的,不如当即就把它整理出来放在博客里,省得遇到时再去到处搜。

  1. Post请求乱码的解决方案:

   手工创建一个过滤器实现javax.servlet.Filter接口:

  1. public class CharacterEncodingFilter implements Filter {  
  2.   
  3.     @Override  
  4.     public void init(FilterConfig filterConfig) throws ServletException {  
  5.     }  
  6.   
  7.     @Override  
  8.     public void doFilter(ServletRequest request, ServletResponse response,  
  9.             FilterChain chain) throws IOException, ServletException {  
  10.         //解决以Post方式提交的中文乱码问题  
  11.         request.setCharacterEncoding("UTF-8");  
  12.         response.setCharacterEncoding("UTF-8");  
  13.         response.setContentType("text/html;charset=UTF-8");  
  14.           
  15.         chain.doFilter(request, response);  
  16.     }  
  17.   
  18.     @Override  
  19.     public void destroy() {  
  20.   
  21.     }  
  22.   
  23.   

在web.xml中配置该过滤器:

  1. <filter>  
  2.    <filter-name>CharacterEncodingFilter</filter-name>  
  3.    <filter-class>cn.lby.filter.CharacterEncodingFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.    <filter-name>CharacterEncodingFilter</filter-name>  
  7.    <url-pattern>/*</url-pattern>  
  8. </filter-mapping>  

 当然,实际开发中一般不会去自己做这个Filter,都是利用框架里封装好的,传参也能通过配置来完成,十分方便,比如spring通常我们会在web.xml中写入下面的代码:

  1. <filter>  
  2.         <filter-name>CharacterEncodingFilter</filter-name>  
  3.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  4.         <init-param>  
  5.             <param-name>encoding</param-name>  
  6.             <param-value>UTF-8</param-value>  
  7.         </init-param>  
  8.     </filter>  
  9.     <filter-mapping>  
  10.         <filter-name>CharacterEncodingFilter</filter-name>  
  11.         <url-pattern>/*</url-pattern>  
  12.     </filter-mapping>  

 2. Get请求乱码的解决方案:

  在字符过滤器中使用动态代理解决中文乱码:

  1. public class CharacterEncodingFilter implements Filter {  
  2.    
  3.     @Override  
  4.     public void init(FilterConfig filterConfig) throws ServletException {  
  5.    
  6.     }  
  7.    
  8.     @Override  
  9.     public void doFilter(ServletRequest request, ServletResponse response,  
  10.             FilterChain chain) throws IOException, ServletException {  
  11.         //解决以Post方式提交的中文乱码问题  
  12.         request.setCharacterEncoding("UTF-8");  
  13.         response.setCharacterEncoding("UTF-8");  
  14.         response.setContentType("text/html;charset=UTF-8");  
  15.            
  16.         ServletRequest requestProxy = getHttpServletRequestProxy((HttpServletRequest)request);  
  17.         chain.doFilter(requestProxy, response);  
  18.     }  
  19.    
  20.     @Override  
  21.     public void destroy() {  
  22.    
  23.     }  
  24.    
  25.     /** 
  26.     * @Method: getHttpServletRequestProxy 
  27.     * @Description: 获取HttpServletRequest对象的代理对象 
  28.     * @param request 
  29.     * @return HttpServletRequest对象的代理对象 
  30.     */  
  31.     private ServletRequest getHttpServletRequestProxy(final HttpServletRequest request){  
  32.         ServletRequest proxy  = (ServletRequest) Proxy.newProxyInstance(  
  33.                 CharacterEncodingFilter.class.getClassLoader(),  
  34.                 request.getClass().getInterfaces(),  
  35.                 new InvocationHandler(){  
  36.                     @Override  
  37.                     public Object invoke(Object proxy, Method method, Object[] args)  
  38.                             throws Throwable {  
  39.                         //如果请求方式是get并且调用的是getParameter方法  
  40.                         if (request.getMethod().equalsIgnoreCase("get") && method.getName().equals("getParameter")) {  
  41.                             //调用getParameter方法获取参数的值  
  42.                             String value = (String) method.invoke(request, args);  
  43.                             if(value==null){  
  44.                                 return null;  
  45.                             }  
  46.                             //解决以get方式提交的中文乱码问题  
  47.                             return new String(value.getBytes("iso8859-1"),"UTF-8");  
  48.                         }else {  
  49.                             //直接调用相应的方法进行处理  
  50.                             return method.invoke(request, args);  
  51.                         }  
  52.                     }  
  53.                 });  
  54.         //返回HttpServletRequest对象的代理对象  
  55.         return proxy;  
  56.     }  
  57.        
  58.    
  59. }  
如果觉得上面的方式太繁琐,也可以通过修改 tomcat 的 server.xml 配置文件:

  1. <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>  

改成:

  1. <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>  

注: 如果是ajax发起的get请求中文依然会乱码,这时候需要把 useBodyEncodingForURI="true" 改为 URIEncoding="UTF-8" 。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值