首页 > 代码库 > 过滤全网乱码

过滤全网乱码

filter类里写代码

包装类思想

 1 package cn.itcast.filter;
 2 
 3 import java.io.IOException;
 4 import java.io.UnsupportedEncodingException;
 5 
 6 import javax.servlet.Filter;
 7 import javax.servlet.FilterChain;
 8 import javax.servlet.FilterConfig;
 9 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.HttpServletRequestWrapper;
14 import javax.servlet.http.HttpServletResponse;
15 
16 public class AllCharacterEncodingFilter implements Filter {
17     private FilterConfig filterConfig;
18     
19     public void init(FilterConfig filterConfig) throws ServletException {
20         this.filterConfig = filterConfig;
21     }
22     public void doFilter(ServletRequest req, ServletResponse resp,
23             FilterChain chain) throws IOException, ServletException {
24         HttpServletRequest request = (HttpServletRequest)req;
25         HttpServletResponse response = (HttpServletResponse)resp;
26         //获取配置的过滤器参数encoding的值:如果没有,给定一个默认值
27         String encoding = filterConfig.getInitParameter("encoding");
28         if(encoding==null)
29             encoding = "UTF-8";
30         //设置POST请求方式的中文请求参数的编码
31         request.setCharacterEncoding(encoding);
32         //设置响应输出时的编码:字符流和字节流
33         response.setCharacterEncoding(encoding);//字节流输出时通知客户端的解码码表
34         response.setContentType("text/html;charset="+encoding);//字节流输出时通知客户端的解码码表;字符流:字符流输出时使用的码表及通知客户端解码用的码表
35         
36         MyHttpServletRequest mrequest = new MyHttpServletRequest(request);
37         //放行
38         chain.doFilter(mrequest, response);
39     }
40 
41     
42     public void destroy() {
43 
44     }
45 }
46 
47 //HttpServletRequestWrapper内部的代码与连接池原理中那个默认适配器一样
48 class MyHttpServletRequest extends HttpServletRequestWrapper{
49     public MyHttpServletRequest(HttpServletRequest request){
50         super(request);
51     }
52     //只对get请求方式进行改写
53     public String getParameter(String name) {
54         String value = http://www.mamicode.com/super.getParameter(name);
55         if(value=http://www.mamicode.com/=null)
56             return value;
57         //得到请求方式
58         String method = super.getMethod();
59         if("get".equalsIgnoreCase(method)){
60             try {
61                 value = http://www.mamicode.com/new String(value.getBytes("ISO-8859-1"),super.getCharacterEncoding());
62             } catch (UnsupportedEncodingException e) {
63                 e.printStackTrace();
64             }
65         }
66         return value;
67     }
68     
69 }
70 class MyHttpServletRequest1 extends HttpServletRequestWrapper{
71     private HttpServletRequest request;
72     public MyHttpServletRequest1(HttpServletRequest request){
73         super(request);
74         this.request = request;
75     }
76     //只对get请求方式进行改写
77     public String getParameter(String name) {
78         String value =http://www.mamicode.com/ request.getParameter(name);
79         if(value=http://www.mamicode.com/=null)
80             return value;
81         //得到请求方式
82         String method = request.getMethod();
83         if("get".equalsIgnoreCase(method)){
84             try {
85                 value = http://www.mamicode.com/new String(value.getBytes("ISO-8859-1"),"UTF-8");
86             } catch (UnsupportedEncodingException e) {
87                 e.printStackTrace();
88             }
89         }
90         return value;
91     }
92     
93 }
View Code

动态代理类思想

 1 package cn.itcast.web.bbs.mvc.filter;
 2 
 3 import java.io.IOException;
 4 import java.lang.reflect.InvocationHandler;
 5 import java.lang.reflect.Method;
 6 import java.lang.reflect.Proxy;
 7 
 8 import javax.servlet.Filter;
 9 import javax.servlet.FilterChain;
10 import javax.servlet.FilterConfig;
11 import javax.servlet.ServletException;
12 import javax.servlet.ServletRequest;
13 import javax.servlet.ServletResponse;
14 import javax.servlet.annotation.WebFilter;
15 import javax.servlet.http.HttpServletRequest;
16 import javax.servlet.http.HttpServletResponse;
17 
18 public class EncodingFilter implements Filter {
19 
20     public EncodingFilter() {
21     }
22 
23     public void destroy() {
24     }
25 
26     /**
27      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
28      */
29     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
30 
31         HttpServletRequest req=(HttpServletRequest) request;
32         HttpServletResponse res=(HttpServletResponse) response;
33         RequestProxy requestProxy=new RequestProxy(req);
34         HttpServletRequest xx=requestProxy.getRequestProxy();
35         chain.doFilter(xx, response);
36     }
37 
38     public void init(FilterConfig fConfig) throws ServletException {
39     }
40 }
41 class RequestProxy
42 {
43     private HttpServletRequest request;
44     public RequestProxy(HttpServletRequest request) {
45         super();
46         this.request = request;
47     }
48     //产生动态代理对象
49     public HttpServletRequest getRequestProxy()
50  {
51         return (HttpServletRequest) Proxy.newProxyInstance(RequestProxy.class
52                 .getClassLoader(), request.getClass().getInterfaces(),
53                 new InvocationHandler() {
54                     @Override
55                     public Object invoke(Object proxy, Method method,
56                             Object[] args) throws Throwable {
57                         Object returnValue="";
58                         String methodName=method.getName();
59                         if(methodName.equals("getParameter"))
60                         {
61                             String methodType=request.getMethod();
62                             if("GET".equalsIgnoreCase((methodType)))
63                             {//乱码
64                                 String temp = (String) method.invoke(request,args);
65                                 //还原
66                                 byte[] buf = temp.getBytes("ISO8859-1");
67                                 //正码
68                                 returnValue = http://www.mamicode.com/new String(buf,"UTF-8");
69                             }
70                             else if("POST".equalsIgnoreCase(methodType))
71                             {
72                                 request.setCharacterEncoding("UTF-8");
73                                 returnValue =http://www.mamicode.com/ method.invoke(request,args);
74                             }
75                         }
76                         else
77                         {
78                             returnValue=http://www.mamicode.com/method.invoke(request, args);
79                         }
80                         return returnValue;
81                     }
82                 });
83     }
84     
85 }
View Code