字符编码过滤器的实现

1.CharacterEncodingFilter.java

 1 package org.guyezhai.modules.encode;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 
14 public class CharacterEncodingFilter implements Filter {
15     private String encoding = "UTF-8";
16     private boolean encodingOn = true;
17     private boolean trimOn = true;
18     private String[] postfixs;
19     
20     @Override
21     public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
22         if (req instanceof CharacterEncodingRequestWrapper) {
23             filterChain.doFilter(req, res);
24             return;
25         }
26         
27         HttpServletRequest request = (HttpServletRequest) req;
28         if (isMultipart(request)) {// 如果是上传文件
29             if (encodingOn) {
30                 request.setCharacterEncoding(encoding);
31             }
32             filterChain.doFilter(req, res);
33             return;
34         }
35         HttpServletResponse response = (HttpServletResponse) res;
36         
37         String suri = request.getRequestURI().toLowerCase();
38         if (isContainPostfix(suri) && request.getCharacterEncoding() == null) {
39             request = new CharacterEncodingRequestWrapper(request, encoding, encodingOn, trimOn);
40         }
41         
42         filterChain.doFilter(request, response);
43     }
44     
45     @Override
46     public void init(FilterConfig filterConfig) throws ServletException {
47         String e = filterConfig.getInitParameter("encoding");
48         if (e != null && !"".equals(e.trim())) {
49             encoding = e;
50         }
51         String eo = filterConfig.getInitParameter("encodingOn");
52         if (eo != null) {
53             encodingOn = Boolean.parseBoolean(eo);
54         }
55         String to = filterConfig.getInitParameter("trimOn");
56         if (to != null) {
57             trimOn = Boolean.parseBoolean(to);
58         }
59         
60         String postfix = filterConfig.getInitParameter("postfixs");
61         if (postfix != null) {
62             postfixs = postfix.split("\|");
63         }
64     }
65     
66     /**
67      * 链接地址是否包含配置的后缀
68      * 
69      * @param suri
70      * @return
71      */
72     private boolean isContainPostfix(String suri) {
73         int i = suri.indexOf('.');
74         if (i == -1 || postfixs == null || postfixs.length == 0) {
75             return true;
76         }
77         
78         for (String s : postfixs) {
79             if (suri.endsWith(s)) {
80                 return true;
81             }
82         }
83         
84         return false;
85     }
86     
87     private boolean isMultipart(HttpServletRequest request) {
88         if (!"post".equals(request.getMethod().toLowerCase())) {
89             return false;
90         }
91         String contentType = request.getContentType();
92         return (contentType != null && contentType.toLowerCase().startsWith("multipart/"));
93     }
94     
95     @Override
96     public void destroy() {
97     }
98 }

2.CharacterEncodingRequestWrapper.java

  1 package org.guyezhai.modules.encode;
  2 
  3 import java.io.UnsupportedEncodingException;
  4 import java.util.Collections;
  5 import java.util.Enumeration;
  6 import java.util.HashMap;
  7 import java.util.Map;
  8 import java.util.Map.Entry;
  9 
 10 import javax.servlet.http.HttpServletRequest;
 11 import javax.servlet.http.HttpServletRequestWrapper;
 12 
 13 import org.apache.commons.lang3.StringEscapeUtils;
 14 
 15 public class CharacterEncodingRequestWrapper extends HttpServletRequestWrapper {
 16     
 17     private final HttpServletRequest request;
 18     private String encoding = "UTF-8";
 19     private boolean encodingOn;
 20     private boolean trimOn;
 21     
 22     private HashMap<String, String[]> parameterMap;
 23     
 24     public CharacterEncodingRequestWrapper(HttpServletRequest request, String encoding, boolean encodingOn, boolean trimOn) {
 25         super(request);
 26         this.request = request;
 27         
 28         this.encodingOn = encodingOn;
 29         String econ = request.getParameter("econ");
 30         if (econ != null) {
 31             if ("y".equalsIgnoreCase(econ)) {
 32                 this.encodingOn = true;
 33             } else if ("n".equalsIgnoreCase(econ)) {
 34                 this.encodingOn = false;
 35             }
 36         }
 37         
 38         if (encoding != null && !"".equals(encoding.trim())) {
 39             this.encoding = encoding;
 40         }
 41         String ec = request.getParameter("ec");
 42         if (ec != null && !"".equals(ec.trim())) {
 43             this.encoding = ec.trim();
 44         }
 45         
 46         this.trimOn = trimOn;
 47         String trimon = request.getParameter("trimon");
 48         if (trimon != null) {
 49             if ("y".equalsIgnoreCase(trimon)) {
 50                 this.trimOn = true;
 51             } else if ("n".equalsIgnoreCase(trimon)) {
 52                 this.trimOn = false;
 53             }
 54         }
 55     }
 56     
 57     @Override
 58     public String getParameter(String name) {
 59         // 修改:从本类中ParameterMap获取并返回
 60         String[] values = getParameterMap().get(name);
 61         if (values != null) {
 62             if (values.length == 0) {
 63                 return "";
 64             }
 65             return StringEscapeUtils.escapeHtml4(values[0]);
 66         } else {
 67             return null;
 68         }
 69     }
 70     
 71     @Override
 72     public Map<String, String[]> getParameterMap() {
 73         if (parameterMap != null) {
 74             return parameterMap;
 75         }
 76         
 77         parameterMap = new HashMap<String, String[]>();
 78         Map<String, String[]> map = request.getParameterMap();
 79         for (Entry<String, String[]> entry : map.entrySet()) {
 80             String key = entry.getKey();
 81             String[] strs = entry.getValue();
 82             String[] tempStr = null;
 83             if (strs != null) {
 84                 tempStr = new String[strs.length];
 85                 for (int i = 0; i < strs.length; i++) {
 86                     tempStr[i] = getEncodedString(strs[i], encoding);
 87                 }
 88             }
 89             parameterMap.put(key, tempStr);
 90         }
 91         return parameterMap;
 92     }
 93     
 94     @Override
 95     public Enumeration<String> getParameterNames() {
 96         // 修改:从本类中ParameterMap获取并返回
 97         return Collections.enumeration(getParameterMap().keySet());
 98     }
 99     
100     @Override
101     public String[] getParameterValues(String name) {
102         // 修改:从本类中ParameterMap获取并返回
103         return getParameterMap().get(name);
104     }
105     
106     private String getEncodedString(String value, String enc) {
107         if (encodingOn) {
108             try {
109                 value = new String(value.getBytes("ISO-8859-1"), encoding);
110             } catch (UnsupportedEncodingException e) {
111             }
112         }
113         if (trimOn) {
114             value = value.trim();
115         }
116         return value;
117     }
118     
119 }

3. web.xml

 1     <filter>
 2         <filter-name>encodingFilter</filter-name>
 3         <filter-class>org.guyezhai.modules.encode.CharacterEncodingFilter</filter-class>
 4         <init-param>
 5             <param-name>encoding</param-name>
 6             <param-value>UTF-8</param-value>
 7         </init-param>
 8         <init-param>
 9             <param-name>encodingOn</param-name>
10             <param-value>true</param-value>
11         </init-param>
12         <init-param>
13             <param-name>trimOn</param-name>
14             <param-value>true</param-value>
15         </init-param>
16         <init-param>
17             <param-name>postfixs</param-name>
18             <param-value>jsp|jspv</param-value>
19         </init-param>
20     </filter>
21     <filter-mapping>
22         <filter-name>encodingFilter</filter-name>
23         <url-pattern>/*</url-pattern>
24         <dispatcher>REQUEST</dispatcher>
25         <dispatcher>FORWARD</dispatcher>
26         <dispatcher>INCLUDE</dispatcher>
27         <dispatcher>ERROR</dispatcher>
28     </filter-mapping>
原文地址:https://www.cnblogs.com/guyezhai/p/5556393.html