zoukankan      html  css  js  c++  java
  • 动态代理练习1全站字符编码过滤[request动态代理]

    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>
  • 相关阅读:
    选项卡
    使用script创建标签添加属性值和添加样式
    判断表单不能为空(表格形式的)
    数组
    关于meta元信息元素
    js判断数据类型
    Ising模型的Metropolis模拟中的组态阻塞和振荡
    python 画能级图
    python 调用 shell 命令,制作用户界面
    打包 python 程序,变成一个可执行文件
  • 原文地址:https://www.cnblogs.com/hacket/p/3053331.html
Copyright © 2011-2022 走看看