思路一:静态代理
在filter中做一个内部类继承HttpServletRequestWrapper(此类采用了适配器模式,全部方法均为引用构造方法中传递的ServletRequest),进行静态代理(装饰者模式)。注意区分get和post请求的编码处理方式。加强(重写)request.getParameter(String key),最后将包装过的request对象(MyRequest)传递给servlet即可(dofilter中传递这个内部类的匿名对象)。
装饰者书写步骤:
1.要求装饰者和被装饰者实现同一个接口或者继承同一个类
2.装饰者中要有被装饰者的引用
3.对需要加强方法进行加强
4.对不需要加强的方法调用原来的方法即可
注意区分get和post:
若是get请求 new String(value.getBytes("iso8859-1"),"utf-8");
若是post请求 只需要设置一句话 request.setCharacterEncoding("utf-8");
思路二:动态代理
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {
//1.强转
final HttpServletRequest request=(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) resp;
//创建代理对象
HttpServletRequest requestProxy=(HttpServletRequest) Proxy.newProxyInstance(HttpServletRequest.class.getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("getParameter".equals(method.getName())){
//获取请求方式
String m = request.getMethod();
if("get".equalsIgnoreCase(m)){
String s = (String) method.invoke(request, args);//相当于 request.getParameter(args);
return new String(s.getBytes("iso8859-1"),"utf-8");
}else if("post".equalsIgnoreCase(m)){
request.setCharacterEncoding("utf-8");
return method.invoke(request, args);
}
}
//不需要加强的方法
return method.invoke(request, args);
}
});
//2.放行
chain.doFilter(requestProxy, response);
}
网友评论