• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

正在努力的小蒋同学

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

过滤器解决Tomcat7以前的请求乱码问题

在我们运行tomcat7以前的版本的时候,会出现中文乱码的问题,在每一次请求里面去解决很麻烦,我们就利用过滤器过滤每一个页面的这个特性去解决这个中文乱码问题。

下面是我们过滤器的一个代码

 1 package com.gyf.tieba.web.filter;
 2 
 3 import java.io.IOException;
 4 import java.io.UnsupportedEncodingException;
 5 import java.util.Map;
 6 import java.util.Map.Entry;
 7 
 8 import javax.servlet.Filter;
 9 import javax.servlet.FilterChain;
10 import javax.servlet.FilterConfig;
11 import javax.servlet.ServletException;
12 import javax.servlet.ServletRequest;
13 import javax.servlet.ServletResponse;
14 import javax.servlet.annotation.WebFilter;
15 import javax.servlet.http.HttpServletRequest;
16 import javax.servlet.http.HttpServletRequestWrapper;
17 
18 
19 public class MyEncodingFilter implements Filter{
20 
21     @Override
22     public void init(FilterConfig filterConfig) throws ServletException {}
23     @Override
24     public void destroy() {}
25     
26     @Override
27     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
28             throws IOException, ServletException {
29         //1.设置POST请求中文乱码的问题,现在使用struts,post请求中文乱码问题就不须要设置
30         request.setCharacterEncoding("UTF-8");
31         System.out.println("拦截请求:" + request);
32         
33         //2.解决get请求的中文乱码问题
34         HttpServletRequest hsr = (HttpServletRequest)request;
35         //判断一下这个请求是否是get请求,如果是则调用我们的内部内方法
36         if(hsr.getMethod().equalsIgnoreCase("get")){
37             MyRequest myRequest = new MyRequest(hsr);
38             //放行请求
39             chain.doFilter(myRequest, response);
40         }else{
41             chain.doFilter(request, response);
42         }
43     
44         
45     }
46 
47 }
48 /**
49  * Wrapper包装类,装饰设计模式,内部有个真实对象的引用
50  *
51  */
52 class MyRequest extends HttpServletRequestWrapper{
53 
54     private HttpServletRequest request;
55     
56     private boolean isEncoding = false;//是否已经utf-8编码
57     
58     public MyRequest(HttpServletRequest request) {
59         super(request);
60         this.request = request;
61     }
62     
63     @Override
64     //重写父类的方法
65     public String getParameter(String name) {
66         return getParameterMap().get(name)[0];
67     }
68     
69     @Override
70     //获取参数的方法
71     public Map<String, String[]> getParameterMap() {
72         //获取客户端传过来的参数数据,并且包装成一个Map集合
73         Map<String, String[]> map = request.getParameterMap();
74         
75         if(isEncoding == true){
76             return map;
77         }
78         
79         //遍历vlaue,改成utf-8编码
80         for(Entry<String, String[]>  entry : map.entrySet()){
81             //取数组值
82             String[] values = entry.getValue();
83             for(int i=0;i<values.length;i++){
84                  try {
85                      //把每一个字符串都改成Utf-8编码
86                      values[i] = new String(values[i].getBytes("ISO-8859-1"),"UTF-8");
87                  } catch (UnsupportedEncodingException e) {
88                     // TODO Auto-generated catch block
89                     e.printStackTrace();
90                 }
91             }
92         }
93         isEncoding = true;
94         
95         return map;
96     }
97 }

使用的方式只需要在web.xml文件里面配置好过滤器就好了

下面我们看看web.xml里面的代码,如果你是在框架里面加过滤器的话,就需要把这个我们自己写的编码过滤器的映射放在框架过滤器的映射前面,这里我们以struts2框架为例

 1     <!-- 1.配置struts的拦截器/过滤器-->
 2     <filter>
 3         <filter-name>struts2</filter-name>
 4         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 5     </filter>
 6 
 7     <!--2.配置tomcat7.0 get请求的乱码问题的编码过滤器-->
 8     <filter>
 9         <filter-name>myEncodingFilter</filter-name>
10         <filter-class>com.gyf.tieba.web.filter.MyEncodingFilter</filter-class>
11     </filter>
12 
13     <filter-mapping>
14         <filter-name>myEncodingFilter</filter-name>
15         <url-pattern>/*</url-pattern>
16     </filter-mapping>
17 
18     <filter-mapping>
19         <filter-name>struts2</filter-name>
20         <url-pattern>/*</url-pattern>
21     </filter-mapping>

注意,我们自己配置的编码过滤器的映射一定要放在框架的过滤器映射前面,这样才能够有效果

posted on 2020-05-15 15:27  正在努力的小蒋同学  阅读(277)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3