1、全站字符编码过滤[request动态代理]
a)使用装饰设计模式
b)使用动态代理
开发步骤:
1)写一个普通类,无需任何继承或实现
2)写一个实例变量,记住代理谁,即目标对象
3)使用构造方法为实例变量赋值
4)写一个普通方法,该方法的返回值是接口,该接口是目标对象的实现接口
a)普通类-即代理类
1 import java.io.IOException; 2 import java.lang.reflect.InvocationHandler; 3 import java.lang.reflect.Method; 4 import java.lang.reflect.Proxy; 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.HttpServletResponse; 14 // 过滤器 15 public class EncodingFilter implements Filter { 16 17 public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException { 18 19 HttpServletRequest request = (HttpServletRequest) req; 20 HttpServletResponse response = (HttpServletResponse) res; 21 MyRequest myRequest = new MyRequest(request); 22 chain.doFilter(myRequest.getProxy(),response); 23 } 24 public void init(FilterConfig filterConfig) throws ServletException { 25 } 26 public void destroy() { 27 } 28 } 29 //使用动态代理方式产生代理对象 30 class MyRequest{ //1、写一个普通类,无需任何继承或实现 31 private HttpServletRequest request;//2、代理谁,代理HttpServletRequest,写一个实例变量,记住代理谁,即目标对象 32 public MyRequest(HttpServletRequest request){//3、使用构造方法为实例变量赋值 33 this.request = request; 34 } 35 public HttpServletRequest getProxy(){//4、写一个普通方法,该方法的返回值是接口,该接口是目标对象的实现接口,即HttpServletRequest 36 return (HttpServletRequest) Proxy.newProxyInstance( 37 MyRequest.class.getClassLoader(), 38 request.getClass().getInterfaces(), 39 new InvocationHandler(){ 40 public Object invoke( 41 Object proxy, 42 Method method, 43 Object[] args) throws Throwable { 44 if("getParameter".equals(method.getName())){ 45 //取得请求的类型[POST或GET] 46 String m = request.getMethod(); 47 //如果是GET请求类型 48 if("get".equalsIgnoreCase(m)){ 49 String value = request.getParameter((String)args[0]);//乱码 50 byte[] buf = value.getBytes("ISO8859-1"); 51 value = new String(buf,"UTF-8");//正码 52 return value; 53 }else if("post".equalsIgnoreCase(m)){ 54 request.setCharacterEncoding("UTF-8"); 55 String value = request.getParameter((String)args[0]);//正码 56 return value; 57 } 58 }else{ 59 //放行 60 return method.invoke(request,args); 61 } 62 return null; 63 } 64 }); 65 } 66 }
b)Servlet-即被代理的类
1 import java.io.IOException; 2 import javax.servlet.ServletException; 3 import javax.servlet.http.HttpServlet; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 7 public class GetPostSetvlet extends HttpServlet { 8 9 public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { 10 request.setCharacterEncoding("utf-8"); 11 String method = request.getMethod(); 12 String username = request.getParameter("username"); 13 System.out.println("用户名["+method+"]:"+username); 14 15 } 16 public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { 17 this.doGet(request, response); 18 } 19 }
c)jsp页面
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 2 <html> 3 <body> 4 <form action="${pageContext.request.contextPath}/GetPostSetvlet" method="post"> 5 <input type="text" name="username"/> 6 <input type="submit" value="登录"/> 7 </form> 8 </body> 9 </html>
d)web.xml配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 <filter> 8 <filter-name>EncodingFilter</filter-name> 9 <filter-class>cn.zengfanshegn.proxy.servlet.EncodingFilter</filter-class> 10 </filter> 11 <filter-mapping> 12 <filter-name>EncodingFilter</filter-name> 13 <servlet-name>GetPostSetvlet</servlet-name> 14 </filter-mapping> 15 16 <servlet> 17 <servlet-name>GetPostSetvlet</servlet-name> 18 <servlet-class>cn.zengfanshegn.proxy.servlet.GetPostSetvlet</servlet-class> 19 </servlet> 20 <servlet-mapping> 21 <servlet-name>GetPostSetvlet</servlet-name> 22 <url-pattern>/GetPostSetvlet</url-pattern> 23 </servlet-mapping> 24 </web-app>