zoukankan      html  css  js  c++  java
  • JavaWeb的学习--Filter

    一、过滤器Filter

    1.filter的简介

    filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理

    2.快速入门

    步骤:

    1)编写一个过滤器的类实现Filter接口

    2)实现接口中尚未实现的方法(着重实现doFilter方法)

    3)在web.xml中进行配置(主要是配置要对哪些资源进行过滤)

    3.Filter的API详解

    (1)filter生命周期及其与生命周期相关的方法

    Filter接口有三个方法,并且这个三个都是与Filter的生命相关的方法

    init(Filterconfig):代表filter对象初始化方法 filter对象创建时执行

    doFilter(ServletRequest,ServletResponse,FilterCha):代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法

    destory():代表是filter销毁方法 当filter对象销毁时执行该方法

    Filter对象的生命周期:

    Filter何时创建:服务器启动时就创建该filter对象

    Filter何时销毁:服务器关闭时filter销毁

    (2)Filter的AP详解

    1)init(FilterConfig)

    其中参数config代表 该Filter对象的配置信息的对象,内部封装是该filter的配置信息。

    2)destory()方法

    filter对象销毁时执行

    3)doFilter方法

    doFilter(ServletRequest,ServletResponse,FilterChain)

    其中的参数:

    ServletRequest/ServletResponse:每次在执行doFilter方法时 web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。该request个该response就是在访问目标资源的service方法时的request和response。

    FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求

    /**
     * Filter过滤器
     * init(FilterConfig):代表filter对象初始化方法 filter对象创建时执行
     * doFilter(ServletRequest,ServletResponse,FilterChain):
     * 代表filter执行过滤的核心方法,如果某资源已经被配置到这个filter进行过滤的话,
     * 那么每次访问该资源都会执行这个方法
     * destory():代表filter销毁方法 当filter对象销毁时执行该方法
     * 
     * Filter对象的生命周期:
     * 何时创建:服务器启动时,创建filter对象
     * 何时销毁:服务器关闭时,filter销毁
     * @author vanguard
     *
     */
    public class QuickFilter01 implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            //获得filter的名称
            String filterName = filterConfig.getFilterName();
            System.out.println(filterName);
            //获得ServletContext对象
            ServletContext context = filterConfig.getServletContext();
            //获得初始化配置信息
            String initParameter = filterConfig.getInitParameter("aaa");
            System.out.println(initParameter);
        
            System.out.println("filter init...");
        }
        
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("filter01 running...");
            //放行
            chain.doFilter(arg0, arg1);
        }
        
        @Override
        public void destroy() {
            System.out.println("filter destory...");
        }    
    }


    4.Filter的配置


    url-pattern配置时

    1)完全匹配  /sertvle1

    2)目录匹配  /aaa/bbb/* ----最多的

    /user/*:访问前台的资源进入此过滤器

    /admin/*:访问后台的资源时执行此过滤器

    3)扩展名匹配  *.abc  *.jsp

     

    注意:url-pattern可以使用servlet-name替代,也可以混用

     

     

    dispatcher:访问的方式(了解)

    REQUEST:默认值,代表直接访问某个资源时执行filter

    FORWARD:转发时才执行filter

    INCLUDE: 包含资源时执行filter

    ERROR:发生错误时 进行跳转是执行filter

     

     

     

    总结Filter的作用?

    1)公共代码的提取

    2)可以对request和response中的方法进行增强(装饰者模式/动态代理)

    3)进行权限控制

    自动登录分析:

     

     代码实现:

     

     1 /**
     2  * 过滤器实现自动登录
     3  * @author vanguard
     4  *
     5  */
     6 public class AutoLoginFilter implements Filter {
     7 
     8     @Override
     9     public void doFilter(ServletRequest request, ServletResponse response,
    10             FilterChain chain) throws IOException, ServletException {
    11         
    12         HttpServletResponse res = (HttpServletResponse) response;
    13         //解决全局中文乱码问题
    14         //POST方式
    15         request.setCharacterEncoding("UTF-8");
    16         //在传递request之前对reqeust的getParameter()方法进行增强
    17         /**
    18          * 装饰者模式(包装)
    19          * 1、增强类和被增强类要实现统一接口
    20          * 2. 在增强内中传入被增强的类
    21          * 3. 需要增强的方法,不需要增强的方法调用被增强对象的方法
    22          */
    23         //被增强的对象
    24         HttpServletRequest req = (HttpServletRequest) request;
    25         //增强的对象
    26         EnhanceRequest enhanceRequest = new EnhanceRequest(req);
    27         
    28         HttpSession session = req.getSession();
    29         //1. 获取客户端携带的cookie
    30         Cookie[] cookies = req.getCookies();
    31         String username_cookie = null;
    32         String password_cookie = null;
    33         if(cookies != null) {
    34             //2. 遍历cookie数组
    35             for(Cookie cookie : cookies) {
    36                 if(cookie.getName().equals("username")) {
    37                     username_cookie = cookie.getValue();
    38                     //中文用户名进行解码
    39                     username_cookie = URLDecoder.decode(username_cookie, "UTF-8");
    40                 }
    41                 if(cookie.getName().equals("password")) {
    42                     password_cookie = cookie.getValue();
    43                 }
    44             }
    45         }
    46         if(username_cookie !=null && password_cookie != null) {
    47             //3. 用户登录
    48             UserService service = new UserService();
    49             User user = null;
    50             try {
    51                 user = service.login(username_cookie, password_cookie);
    52             } catch (SQLException e) {
    53                 
    54                 e.printStackTrace();
    55             }
    56             //4. 将user存入session域中
    57             session.setAttribute("user", user);
    58         }
    59         //5. 放行
    60         chain.doFilter(enhanceRequest, res);
    61     }
    62     
    63     @Override
    64     public void destroy() {
    65     }
    66 
    67 
    68     @Override
    69     public void init(FilterConfig arg0) throws ServletException {
    70     }
    71 }

     

     

    解决全局乱码

    在传递request之前对reqeust的getParameter()方法进行增强

      装饰者模式(包装)

      1、增强类和被增强类要实现统一接口

      2. 在增强内中传入被增强的类

      3. 需要增强的方法,不需要增强的方法调用被增强对象的方法

    代码实现:

     

     1 /**
     2  * 解决全局乱码问题
     3  * 在传递request之前对reqeust的getParameter()方法进行增强
     4  * 装饰者模式(包装)
     5  * 1、增强类和被增强类要实现统一接口
     6  * 2. 在增强内中传入被增强的类
     7  * 3. 需要增强的方法,不需要增强的方法调用被增强对象的方法
     8  * @author vanguard
     9  *
    10  */
    11 public class EncodingFilter implements Filter {
    12 
    13 
    14     @Override
    15     public void doFilter(ServletRequest request, ServletResponse response,
    16             FilterChain chain) throws IOException, ServletException {
    17         //POST方式
    18         request.setCharacterEncoding("UTF-8");
    19         //在传递request之前对reqeust的getParameter()方法进行增强
    20         /**
    21          * 装饰者模式(包装)
    22          * 1、增强类和被增强类要实现统一接口
    23          * 2. 在增强内中传入被增强的类
    24          * 3. 需要增强的方法,不需要增强的方法调用被增强对象的方法
    25          */
    26         //被增强的对象
    27         HttpServletRequest req = (HttpServletRequest) request;
    28         //增强的对象
    29         EnhanceRequest enhanceRequest = new EnhanceRequest(req);
    30         //放行
    31         chain.doFilter(enhanceRequest, response);
    32     }
    33 
    34     @Override
    35     public void destroy() {
    36     }
    37     @Override
    38     public void init(FilterConfig arg0) throws ServletException {
    39     }
    40 
    41 }

     

     1 /**
     2  * 装饰者模式
     3  * 增强的Request类
     4  * @author vanguard
     5  *
     6  */
     7 class EnhanceRequest extends HttpServletRequestWrapper  {
     8     private HttpServletRequest request;
     9     
    10     public EnhanceRequest(HttpServletRequest request) {
    11         super(request);
    12         this.request = request;
    13     }
    14     //重写要增强的方法
    15     @Override
    16     public String getParameter(String name) {
    17         String parameter = request.getParameter(name);
    18         if(parameter != null) {
    19             try {
    20                 parameter = new String(parameter.getBytes("ISO-8859-1"), "UTF-8");
    21             } catch (UnsupportedEncodingException e) {
    22                 
    23                 e.printStackTrace();
    24             }
    25         }
    26         return parameter;
    27     }
    28     
    29     @Override
    30     public Map<String, String[]> getParameterMap() {
    31         Map<String, String[]> parameterMap = request.getParameterMap();
    32         for(String key : parameterMap.keySet()) {
    33             String[] parameters = parameterMap.get(key);
    34             for(int i = 0; i < parameters.length; i++) {
    35                 String parameter = null;
    36                 if(parameters[i] != null) {
    37                     try {
    38                         parameter = new String(parameters[i].getBytes("ISO-8859-1"), "UTF-8");
    39                     } catch (UnsupportedEncodingException e) {
    40                         
    41                         e.printStackTrace();
    42                     }
    43                 }
    44                 parameters[i] = parameter;
    45             }47         }
    48         return parameterMap;
    49     }
    50 }

     

  • 相关阅读:
    文件处理
    三元运算
    python 第二章 二进制运算、字符编码、数据类型
    python 第一章 基础语法
    刷题-力扣-611. 有效三角形的个数
    刷题-力扣-581. 最短无序连续子数组
    刷题-力扣-LCP 07. 传递信息
    刷题-力扣-1833. 雪糕的最大数量
    刷题-力扣-168. Excel表列名称
    刷题-力扣-337. 打家劫舍 III
  • 原文地址:https://www.cnblogs.com/guodong-wang/p/7401691.html
Copyright © 2011-2022 走看看