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>