JavaWeb:(十二)Filter

12.1 过滤器简介

12.1.1 通过类比了解过滤器作用

  • 坐地铁
    在这里插入图片描述
  • 登录检查

./images

12.1.2 过滤器的三要素

  1. 拦截

    过滤器之所以能够对请求进行预处理,关键是对请求进行拦截,把请求拦截下来才能够做后续的操作。而且对于一个具体的过滤器,它必须明确它要拦截的请求,而不是所有请求都拦截。

  2. 过滤

    根据业务功能实际的需求,看看在把请求拦截到之后,需要做什么检查或什么操作,写对应的代码即可。

  3. 放行

    过滤器完成自己的任务或者是检测到当前请求符合过滤规则,那么可以将请求放行。所谓放行,就是让请求继续去访问它原本要访问的资源。

友情提示:将来学习SpringMVC时,会学习SpringMVC中的『拦截器』,同样具备三要素。

12.2 HelloWorld

./images

12.2.1 准备工作

  • 创建module
  • 加入Thymeleaf环境
  • 完成首页访问功能
  • 创建Target01Servlet以及target01.html
  • 创建SpecialServlet以及special.html

12.2.2创建Filter

  1. 创建Target01Filter类

    • 要点1:实现javax.servlet.Filter接口
    • 要点2:在doFilter()方法中执行过滤
    • 要点3:如果满足过滤条件使用 chain.doFilter(request, response);放行
    • 要点4:如果不满足过滤条件转发或重定向请求
      • 附带问题:Thymeleaf模板渲染。这里我们选择的解决办法是跳转到一个Servlet,由Servlet负责执行模板渲染返回页面。
    public class Target01Filter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
            // 1.打印一句话表明Filter执行了
            System.out.println("过滤器执行:Target01Filter");
    
            // 2.检查是否满足过滤条件
            // 人为设定一个过滤条件:请求参数message是否等于monster
            // 等于:放行
            // 不等于:将请求跳转到另外一个页面
            // ①获取请求参数
            String message = request.getParameter("message");
    
            // ②检查请求参数是否等于monster
            if ("monster".equals(message)) {
                // ③执行放行
                // FilterChain对象代表过滤器链
                // chain.doFilter(request, response)方法效果:将请求放行到下一个Filter,
                // 如果当前Filter已经是最后一个Filter了,那么就将请求放行到原本要访问的目标资源
                chain.doFilter(request, response);
    
            }else{
                // ④跳转页面
                request.getRequestDispatcher("/SpecialServlet?method=toSpecialPage").forward(request, response);
            }
        }
        @Override
        public void destroy() {
    
        }
    }
    
  2. 在web.xml中配置Target01Filter类

    <!-- 配置Target01Filter -->
    <filter>
        <!-- 配置Filter的友好名称 -->
        <filter-name>Target01Filter</filter-name>
    
        <!-- 配置Filter的全类名,便于Servlet容器创建Filter对象 -->
        <filter-class>com.atguigu.filter.filter.Target01Filter</filter-class>
    </filter>
    
    <!-- 配置Filter要拦截的目标资源 -->
    <filter-mapping>
        <!-- 指定这个mapping对应的Filter名称 -->
        <filter-name>Target01Filter</filter-name>
    
        <!-- 通过请求地址模式来设置要拦截的资源 -->
        <url-pattern>/Target01Servlet</url-pattern>
    </filter-mapping>
    

12.3 过滤器生命周期

和Servlet生命周期类比,Filter生命周期的关键区别是:在Web应用启动时创建对象;而Servlet是在第一次收到请求时创建对象

生命周期阶段执行时机执行次数
创建对象Web应用启动时一次
初始化创建对象后一次
拦截请求接收到匹配的请求多次
销毁Web应用卸载前一次

12.4 过滤器链

  • 多个Filter的拦截范围如果存在重合部分,那么这些Filter会形成Filter链
  • 浏览器请求重合部分对应的目标资源时,会依次经过Filter链中的每一个Filter。
  • Filter链中每一个Filter执行的顺序是由web.xml中filter-mapping配置的顺序决定的。(如果是注解配置则根据全类名进行排序)

./images

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值