思路:Proxy动态代理对HttpServletRequest的getParameter方法进行增强 ,FIlter过滤器在放行的时候,传递的是代理对象HttpServletRequest。
@Override
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest)req;
//生成JDK动态代理,增强HttpServletRequest的getParameter方法
HttpServletRequest myRequest = (HttpServletRequest) Proxy.newProxyInstance(EncodingFilter.class.getClassLoader(), request.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("getParameter".equalsIgnoreCase(method.getName())) {
// 获取本次请求方式 GET POST
String requestMethod = request.getMethod();
if ("GET".equalsIgnoreCase(requestMethod)) {
String str = (String) method.invoke(request, args);
String newStr = new String(str.getBytes("ISO-8859-1"), "UTF-8");
return newStr;
}
if ("POST".equalsIgnoreCase(requestMethod)) {
request.setCharacterEncoding("UTF-8");
Object obj = method.invoke(request, args);
return obj;
}
}
// 执行原方法
return method.invoke(request, args);
}
});
//放行的时候,要传递增强后的代理对象
chain.doFilter(myRequest, response);
}