过滤器-用动态代理解决全站乱码

01.package cn.itcast.web.filter;  
02.import java.io.IOException;  
03.import java.lang.reflect.InvocationHandler;  
04.import java.lang.reflect.Method;  
05.import java.lang.reflect.Proxy;  
06.import javax.servlet.Filter;  
07.import javax.servlet.FilterChain;  
08.import javax.servlet.FilterConfig;  
09.import javax.servlet.ServletException;  
10.import javax.servlet.ServletRequest;  
11.import javax.servlet.ServletResponse;  
12.import javax.servlet.http.HttpServletRequest;  
13.import javax.servlet.http.HttpServletResponse;  
14.  
15.public class CharacterEncodingFilter3 implements Filter {  
16.  
17.  
18.    public void doFilter(ServletRequest req, ServletResponse resp,  
19.            FilterChain chain) throws IOException, ServletException {  
20.  
21.        final HttpServletRequest request = (HttpServletRequest) req;  
22.        HttpServletResponse response = (HttpServletResponse) resp;  
23.          
24.        //解决post请求的中文乱码  
25.        request.setCharacterEncoding("UTF-8");  
26.        response.setCharacterEncoding("UTF-8");  
27.        response.setContentType("text/html;charset=UTF-8");  
28.          
29.        //解决get请求的中文乱码  
30.        //放行  将代理对象带过去  将会拦截对request.getparameter的访问,拦截后,由代理对象进行编码处理,再返回给浏览器   第一个参数是类加载器,第二个参数是代理需要处理的对象                                  
31.        chain.doFilter((ServletRequest) Proxy.newProxyInstance(this.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler(){  
32.  
33.            public Object invoke(Object proxy, Method method, Object[] args)  
34.                    throws Throwable {  
35.                  
36.            String methodname = method.getName();  //拿到当前的方法  
37.            if(methodname.equals("getParameter")){ //如果执行的是需要拦截的方法 
38.                //执行request.getparameter获取结果  由tomcat的request(没有经过代理处理的request)执行该方法并得到Parameter的取值
39.                String value = (String) method.invoke(request, args);  
40.                if(value==null){  //取值为空,直接返回
41.                    return null;  
42.                }  
43.                if(!request.getMethod().equalsIgnoreCase("post")){ //判断是为post请求,直接返回  
44.                    return value;  
45.                }  
46.                //如果是get请求,则经行转换编码返回  
47.                value = new String(value.getBytes("iso8859-1"),"UTF-8");  
48.                return value;  
49.            }  
50.            //如果拦截的方法不是request.getParameter,则交给tomcat的request执行请求  
51.            return method.invoke(request, args);  
52.            }  
53.              
54.        }), response);     
55.          
56.    }  
57.  
58.    public void init(FilterConfig filterConfig) throws ServletException {  
59.        // TODO Auto-generated method stub  
60.  
61.    }  
62.    public void destroy() {  
63.        // TODO Auto-generated method stub  
64.  
65.    }  
66.} 

   如果不使用动态代理处理,也可以使用包装类进行处理,即加强request的功能,但是过程非常复杂,需要较多的包和类。

 

转载自:http://blog.csdn.net/furongkang/article/details/6761103

posted @ 2014-07-08 10:09  Pengineer  阅读(252)  评论(0编辑  收藏  举报