过滤全网乱码

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 = super.getParameter(name);

55         if(value==null)

56             return value;

57         //得到请求方式

58         String method = super.getMethod();

59         if("get".equalsIgnoreCase(method)){

60             try {

61                 value = 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 = request.getParameter(name);

79         if(value==null)

80             return value;

81         //得到请求方式

82         String method = request.getMethod();

83         if("get".equalsIgnoreCase(method)){

84             try {

85                 value = 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 = new String(buf,"UTF-8");

69                             }

70                             else if("POST".equalsIgnoreCase(methodType))

71                             {

72                                 request.setCharacterEncoding("UTF-8");

73                                 returnValue = method.invoke(request,args);

74                             }

75                         }

76                         else

77                         {

78                             returnValue=method.invoke(request, args);

79                         }

80                         return returnValue;

81                     }

82                 });

83     }

84     

85 }
View Code

 

你可能感兴趣的:(乱码)