package com.zykj.utils; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.util.Assert; import org.springframework.web.filter.OncePerRequestFilter; /** * @deprecated 对SpringMVC中post和get请求进行乱码处理 * 此方法为采用动态代理 * @date 2017-12-10 * @author qidalei */ public class SpringCharacterEncodingFilter extends OncePerRequestFilter { /** * 在web.xml中的int标签中进行初始化配置, encoding:设置编码格式 * forceEncoding:设置是否进行response响应处理编码true为处理,false为不处理默认不处理 * <init-param> * <param-name>encoding</param-name> * <param-value>UTF-8</param-value> * </init-param> * */ private String encoding; private boolean forceEncoding; public SpringCharacterEncodingFilter() { this.forceEncoding = false; } public SpringCharacterEncodingFilter(String encoding) { this(encoding, false); } public SpringCharacterEncodingFilter(String encoding, boolean forceEncoding) { this.forceEncoding = false; Assert.hasLength(encoding, "Encoding must not be empty"); this.encoding = encoding; this.forceEncoding = forceEncoding; } public void setEncoding(String encoding) { this.encoding = encoding; } public void setForceEncoding(boolean forceEncoding) { this.forceEncoding = forceEncoding; } protected void doFilterInternal(HttpServletRequest req, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { final HttpServletRequest request = req; if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) { // 对post请求进行编码控制 request.setCharacterEncoding(this.encoding); // 对response响应进行编码控制 if (this.forceEncoding) { response.setCharacterEncoding(this.encoding); } // 对get请求进行处理(此处可以对不同请求进行设置) String methodName = request.getMethod(); if ("get".equalsIgnoreCase(methodName)) { HttpServletRequest requestProxy = (HttpServletRequest) Proxy.newProxyInstance( this.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName()); if ("getParameter".equalsIgnoreCase(method.getName())) { String value = request.getParameter((String) args[0]); if (value == null) { return ""; } return new String(value.getBytes("iso-8859-1"), "utf-8"); } if ("getParameterValues".equalsIgnoreCase(method.getName())) { String[] values = request.getParameterValues((String) args[0]); if (values == null) { return null; } for (int i = 0; i < values.length; i++) { values[i] = new String(values[i].getBytes("iso8859-1"), "utf-8"); System.out.println(values[i]); } return values; } return method.invoke(request, args); } }); filterChain.doFilter(requestProxy, response); return; } } filterChain.doFilter(request, response); } }
web,xml配置文件
<filter> <filter-name>encoding</filter-name> <filter-class>com.zykj.utils.SpringCharacterEncodingFilter</filter-class> <init-param> <!-- encoding 设置编码格式 --> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <!-- forceEncoding设置为true对response响应进行乱码控制 --> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
未解决的问题:当在过滤器中设置getParameterMap时,会产生页面接收不到对应的参数,因此在过滤器中仅对getParameter和getParameterValues进行了增强。