【小结】利用filter做统一编码转换

思路一:静态代理

在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);
}

你可能感兴趣的:(【小结】利用filter做统一编码转换)