• 字符编码过滤器的实现


    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>
  • 相关阅读:
    ansible-playbook最佳实践
    zabbix 优化之 表分区
    ansible-playbook 打通ssh无秘钥
    jQuery 1.9 移除了 $.browser 的替代方法
    也谈前端基础设施建设
    滚动视差网站欣赏
    css常见的快捷开发代码汇总(长期更新)
    如何让搜索引擎抓取AJAX内容?
    Bookmarklet编写指南
    20个网页设计师应该学习的CSS3经典教程实例
  • 原文地址:https://www.cnblogs.com/guyezhai/p/5556393.html
Copyright © 2020-2023  润新知