JavaWeb 之 18.过滤器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013987258/article/details/83855487

## 过滤器(重点) ##


**过滤器的概述**
    
    1.过滤器是双向的
    2.拦截一堆目标资源。(由配置文件决定)


    
**过滤器的简单入门**    
    
    1.编写一个类,实现filter接口,重写3个方法
    2.在web.xml中进行配置。
        <!-- 配置过滤器的信息 -->
        <filter>
            <!-- 配置名字 -->
            <filter-name>FilterDemo1</filter-name>
            <!-- 包名+类名 -->
            <filter-class>cn.itcast.filter.FilterDemo1</filter-class>
        </filter>
        <!-- 配置过滤器的映射 -->
        <filter-mapping>
            <filter-name>FilterDemo1</filter-name>
            <!-- 配置访问方式 -->
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        
        
**FilterChain对象**
    
    1.doFilter(ServletRequest request, ServletResponse response)     执行下一个过滤器,如果没有下一个过滤器,访问目标资源。
    
**过滤器的生命周期**

    1.Servlet生命周期:Servlet什么时候创建?默认不是由服务器启动时创建的,第一次访问的创建。调用init方法进行初始化操作。
                     Servlet什么是销毁?服务器关闭的时候或者移除项目时候。默认调用destroy()方法。
    
    2.过滤器的生命周期:
        * void init(FilterConfig filterConfig)        -- 过滤器什么时候创建的?
        * void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)  -- 放行
        * void destroy()    -- 过滤器什么时候销毁
        
    3.总结:服务器启动的时候创建过滤器实例(单例的),默认调用init方法进行初始化操作,doFilter方法就会执行。有一次执行一次。过滤器是关闭服务器或者移除项目销毁,销毁之前调用destroy方法进行销毁。
        

**FilterConfig接口**

    1.ServletConfig
        * 获取servlet-name的名称
        * 获取初始化参数
        * 获取ServletContext对象
        
    2.FilterConfig对象的方法
        * String getFilterName()                  -- 获取<filter-name>的名称
        * String getInitParameter(String name)  -- 获取初始化参数的值(重点)
        * Enumeration getInitParameterNames()      -- 获取初始化参数(重点)
        * ServletContext getServletContext()      -- 获取ServletContext域对象(重点)
        
        
**过滤器的配置**
    
    1.配置<filter>
        * <filter-name>    -- 配置filter的名称
        * <filter-class>    -- 包名+类名
        * <init-param>    -- 配置初始化参数
        
    2.配置<filter-mapping>
        * <filter-name>    -- 配置filter的名称和<filter>标签中的<filter-name>配置必须是相同的。
        * <url-pattern>    -- 配置过滤的路径
            * 完全路径匹配        以/开头的   /aa        /aa/bb        localhost/day21/aa/bb
            * 目录匹配            以/开头的    /*        /aa/*        localhost/day21/aa/bb
            * 扩展名匹配        不能以/开头   *.jsp                访问所有的jsp都会被拦截    
            
            * 优先级:完全路径 > 目录匹配 > 扩展名匹配
            * 在web.xml中配置2个(A,B)过滤器,每个过滤器的配置都是/*  AB过滤器执行顺序是什么样的?
                * 和在web.xml中的配置(<filter-mapping>)顺序有关。
            
        * <servlet-name>    -- 过滤器过滤指定的servlet  直接配置Servlet的名称
        * <dispatcher>    
            * REQUEST    -- 默认只拦截请求。REQUEST也是默认值。
            * FORWARD    -- 只拦截转发的
            * INCLUDE    -- 包含
            * ERROR        -- 需要在web.xml进行配置
            

            
**过滤器的案例**

**设置全局的编码**
    
    1.每次在编写表单和向页面做出响应的时候,都需要设置request和response的一些信息。
    2.那咱们就可以使用过滤器来解决类似的问题。
    
    
**禁用浏览器的缓存**
    
    1.记住CEP三个头。日期类型。
    
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Pragma", "no-cache");
    // 第三个头是日期类型
    response.setDateHeader("Expires", -1);

    
**分ip统计访问的次数**
    
    1.怎么获取ip地址:request.getRemoteAddr() 
         * 1.获取map
         * 2.获取ip
         * 3.在map中和ip做对比
         *     * 如果map中有ip,获取count,+1
         *     * 如果map中没有ip,把ip和count=1存入到map中
         * 4.把map存入到ServletContext中
         * 5.放行


**自动登陆的功能**
    
    1.依赖登陆的功能。已搞定。
    2.分析需求:必须先登陆,并且选择自动登陆的按钮。下一次再直接访问suc.jsp的时候,直接进去了,不用再登陆了。
    3.分析哪些技术?
        * 需要先使用cookie,cookie可以记住用户名和密码。下一次请求,默认携带cookie过来了。
        * 还需要session,第一次登陆的时候,把用户名和密码保存到session中。通过session来判断是否登陆成功。
        * 过滤器,拦截的目的:获取cookie,获取用户名和密码,和数据库查询,匹配了,把用户的信息放入session中。
        
    4.cookie技术,保存数据,回写到浏览器。设置有效时间。
        * 把用户名和密码保存起来。回写到客户端上。


    5.分析的过程
        * 在过滤器中可以直接获取session中的用户信息,如果user不为空,说明浏览器没关。放行。
        * 从session中获取不到user的信息
        * 先获取cookie,获取指定名称的cookie,
        * 如果cookie为空,放行。
        * 如果cookie不为空,获取用户名和密码。去数据库查询。
        * 如果查询不到,cookie的信息不正确,放行(没有存入session中)。
        * 如果查询到了,cookie中的信息是正确,把用户的信息保存到session中。放行。


        
        
**URL级别(粗粒度)的权限验证**
    
    1.需求:依赖用户登陆的功能。如果你的用户的type类型是admin,只能让用户访问/admin/xxx.jsp文件。如果用户的type是usesr的话,只能访问/user/xxx.jsp的文件。
    
    2.分析:
        

猜你喜欢

转载自blog.csdn.net/u013987258/article/details/83855487
今日推荐