【Java】全站编码过滤器GenericEncodingFilter代码与配置

编码过滤器GenericEncodingFilter:

 
  1 package com.fuck.web.filter;
  2 
  3 import java.io.IOException;
  4 import java.io.UnsupportedEncodingException;
  5 import java.util.Map;
  6 
  7 import javax.servlet.Filter;
  8 import javax.servlet.FilterChain;
  9 import javax.servlet.FilterConfig;
 10 import javax.servlet.ServletException;
 11 import javax.servlet.ServletRequest;
 12 import javax.servlet.ServletResponse;
 13 import javax.servlet.http.HttpServletRequest;
 14 import javax.servlet.http.HttpServletRequestWrapper;
 15 
 16 /**
 17  * 解决get和post请求 全部乱码
 18  * 
 19  * @author seawind
 20  * 
 21  */
 22 public class GenericEncodingFilter implements Filter {
 23 
 24     @Override
 25     public void destroy() {
 26     }
 27 
 28     @Override
 29     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 30         // 转型为与协议相关对象
 31         HttpServletRequest httpServletRequest = (HttpServletRequest) request;
 32         // 对request包装增强
 33         HttpServletRequest myrequest = new MyRequest(httpServletRequest);
 34         response.setContentType("text/html;charset=utf-8");
 35         chain.doFilter(myrequest, response);
 36     }
 37 
 38     @Override
 39     public void init(FilterConfig filterConfig) throws ServletException {
 40     }
 41 
 42 }
 43 
 44 // 自定义request对象
 45 class MyRequest extends HttpServletRequestWrapper {
 46 
 47     private HttpServletRequest request;
 48 
 49     private boolean hasEncode;
 50 
 51     public MyRequest(HttpServletRequest request) {
 52         super(request);// super必须写
 53         this.request = request;
 54     }
 55 
 56     // 对需要增强方法 进行覆盖
 57     @Override
 58     public Map getParameterMap() {
 59         // 先获得请求方式
 60         String method = request.getMethod();
 61         if (method.equalsIgnoreCase("post")) {
 62             // post请求
 63             try {
 64                 // 处理post乱码
 65                 request.setCharacterEncoding("utf-8");
 66                 return request.getParameterMap();
 67             } catch (UnsupportedEncodingException e) {
 68                 e.printStackTrace();
 69             }
 70         } else if (method.equalsIgnoreCase("get")) {
 71             // get请求
 72             Map<String, String[]> parameterMap = request.getParameterMap();
 73             if (!hasEncode) { // 确保get手动编码逻辑只运行一次
 74                 for (String parameterName : parameterMap.keySet()) {
 75                     String[] values = parameterMap.get(parameterName);
 76                     if (values != null) {
 77                         for (int i = 0; i < values.length; i++) {
 78                             try {
 79                                 // 处理get乱码
 80                                 values[i] = new String(values[i].getBytes("ISO-8859-1"), "utf-8");
 81                             } catch (UnsupportedEncodingException e) {
 82                                 e.printStackTrace();
 83                             }
 84                         }
 85                     }
 86                 }
 87                 hasEncode = true;
 88             }
 89             return parameterMap;
 90         }
 91 
 92         return super.getParameterMap();
 93     }
 94 
 95     @Override
 96     public String getParameter(String name) {
 97         Map<String, String[]> parameterMap = getParameterMap();
 98         String[] values = parameterMap.get(name);
 99         if (values == null) {
100             return null;
101         }
102         return values[0]; // 取回参数的第一个值
103     }
104 
105     @Override
106     public String[] getParameterValues(String name) {
107         Map<String, String[]> parameterMap = getParameterMap();
108         String[] values = parameterMap.get(name);
109         return values;
110     }
111 
112 }

WEB-INF下的web.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>estoredemo</display-name>
  <filter>
     <filter-name>GenericEncodingFilter</filter-name>
     <filter-class>com.fuck.web.filter.GenericEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>GenericEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

=================================================================================================

网上看到另一个,其实和上面基本一模一样,不过也贴上做个备份吧

 1 import java.io.IOException;  
 2 import java.util.Map;  
 3   
 4 import javax.servlet.Filter;  
 5 import javax.servlet.FilterChain;  
 6 import javax.servlet.FilterConfig;  
 7 import javax.servlet.ServletException;  
 8 import javax.servlet.ServletRequest;  
 9 import javax.servlet.ServletResponse;  
10 import javax.servlet.http.HttpServletRequest;  
11 import javax.servlet.http.HttpServletRequestWrapper;  
12   
13 public class EncodingFilter implements Filter {  
14     private FilterConfig config = null;  
15     private String encode = null;  
16      
17      public void destroy() {  
18          
19     }  
20   
21     public void doFilter(ServletRequest request, ServletResponse response,  
22             FilterChain chain) throws IOException, ServletException {  
23         response.setContentType("text/html;charset="+encode); //--解决响应乱码  
24         //--包装改造request中和获取请求参数相关的方法解决请求参数乱码  
25         chain.doFilter(new MyHttpServletRequest((HttpServletRequest) request), response);  
26     }  
27      
28     public void init(FilterConfig filterConfig) throws ServletException {  
29         this.config = filterConfig;  
30         encode = config.getInitParameter("encode") == null?"utf-8":config.getInitParameter("encode");  
31     }  
32   
33   
34   
35     //内部类,装饰类改造HttpServletRequest   的三个方法  
36     class MyHttpServletRequest extends HttpServletRequestWrapper{  
37         private HttpServletRequest request = null;  
38         private boolean isNotEncode = true;  
39         public MyHttpServletRequest(HttpServletRequest request) {  
40             super(request);  
41             this.request = request;  
42         }  
43          
44         @Override  
45         public Map getParameterMap() {  
46             try{  
47                 if(request.getMethod().equalsIgnoreCase("POST")){//--如果是post提交,一行代码解决post提交请求参数乱码  
48                     request.setCharacterEncoding(encode);  
49                     return request.getParameterMap();  
50                 }else if(request.getMethod().equalsIgnoreCase("GET")){//--如果是get提交,则应该手动编解码解决乱码  
51                     Map<String,String[]> map = request.getParameterMap();//获取有乱码的map  
52                     if(isNotEncode){//只能在第一次解决乱码  
53                         for(Map.Entry<String, String[]> entry : map.entrySet()){//遍历map,解决所有值的乱码  
54                             String [] vs = entry.getValue();  
55                             for(int i=0;i<vs.length;i++){  
56                                 vs[i] = new String(vs[i].getBytes("iso8859-1"),encode);  
57                             }  
58                         }  
59                         isNotEncode = false;//设置为false,第二次就不会再进这个代码块了  
60                     }  
61                     return map;  
62                 }else{  
63                     return request.getParameterMap();  
64                 }  
65             }catch (Exception e) {  
66                 e.printStackTrace();  
67                 throw new RuntimeException(e);  
68             }  
69         }  
70          
71         @Override  
72         public String[] getParameterValues(String name) {  
73             return (String[]) getParameterMap().get(name);  
74         }  
75          
76         @Override  
77         public String getParameter(String name) {  
78             return getParameterValues(name) == null ? null : getParameterValues(name)[0];  
79         }  
80     }  
81 }  
<filter>  
    <description>全站乱码过滤器</description>  
    <filter-name>encodeFilter</filter-name>  
    <filter-class>com.java.filter.EncodingFilter</filter-class>  
    <init-param>  
        <param-name>encode</param-name>  
        <param-value>utf-8</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>encodeFilter</filter-name>  
    <url-pattern>/*</url-pattern> -----------------------------------------拦截的路径  
</filter-mapping>  
原文地址:https://www.cnblogs.com/dflmg/p/6278434.html