关于动态代理的介绍可以看这篇文章详情
下面直接贴出Filter的代码:
package blog.csdn.net.web;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Map;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 用于解决全站get、post请求参数乱码问题以及响应请求乱码问题的Filter 用到动态代理技术
*
* @author Lucky
*
*/
@WebFilter(urlPatterns = "/*")
public class GenericEncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 强转
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// 解决响应乱码问题
httpServletResponse.setContentType("text/html;charset=utf-8");
// 通过Proxy.newProxyInstance()方法获得代理对象
HttpServletRequest proxyRequest = (HttpServletRequest) Proxy.newProxyInstance(
GenericEncodingFilter.class.getClassLoader(), httpServletRequest.getClass().getInterfaces(),
new MyInvocationHandler(httpServletRequest));
// 这里放行的时候,传入的是HttpServletRequest接口实现类的代理对象,客户端在执行getParameterXxx()方法的时候就会先执行代理类的逻辑
chain.doFilter(proxyRequest, httpServletResponse);
}
public void destroy() {
// TODO Auto-generated method stub
}
/**
* 对方原HttpServletRequest的getParameter/getParameterValues/getParameterMap方法进行增强处理的Handler
*
* @author mChenys
*
*/
class MyInvocationHandler implements InvocationHandler {
private HttpServletRequest httpServletRequest;
public MyInvocationHandler(HttpServletRequest httpServletRequest) {
this.httpServletRequest = httpServletRequest;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (httpServletRequest.getMethod().equalsIgnoreCase(("get"))) {
/**
* 处理get方式提交参数乱码的问题
*/
if (method.getName().equals("getParameter")) {
// 处理调用getParameter()方法时的参数乱码问题
String value = (String) method.invoke(httpServletRequest, args);
return new String(value.getBytes("ISO8859-1"), "utf-8");// 返回处理乱码后的值,这里是单个值
} else if (method.getName().equals("getParameterMap")) {
// 处理调用getParameterMap()方法时参数乱码的问题
Map<String, String[]> map = (Map<String, String[]>) method.invoke(httpServletRequest, args);
Set<String> keySet = map.keySet();
for (String key : keySet) {
String[] values = map.get(key);
for (int i = 0; i < values.length; i++) {
values[i] = new String(values[i].getBytes("ISO8859-1"), "utf-8");
}
}
return map;
} else if (method.getName().equals("getParameterValues")) {
String[] values = (String[]) method.invoke(httpServletRequest, args);
for (int i = 0; i < values.length; i++) {
values[i] = new String(values[i].getBytes("ISO8859-1"), "utf-8");
}
return values;// 返回处理乱码后的多个值
}
} else if (httpServletRequest.getMethod().equalsIgnoreCase(("post"))) {
/**
* 处理post方式提交参数的乱码问题
*/
httpServletRequest.setCharacterEncoding("utf-8");
return method.invoke(httpServletRequest, args);
}
// 不需要加强的方法 调用 原有的逻辑,
return method.invoke(httpServletRequest, args);
}
}
}