10.Filter

10.Filter

一、简介

  • Filter翻译过来叫过滤器,用来拦截请求,是服务器端的三大组件之一
  • 服务器端的三大组件:Servlet、Filter、Listener
  • 服务器端三大组件的特点
    • 它们都需要实现某一个接口
    • 它们都需要在web.xml中进行注册
    • 它们的对象都由服务器创建,并且在特定的时机自动调用对应的方法

二、HelloWorld

  • 1)创建一个类实现Filter接口
package com.atguigu.filter;

import javax.servlet.*;
import java.io.IOException;

public class HelloFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    //拦截请求的方法
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("此山是我开,此树是我栽,要想从此过,留下买路财!");
        //放行请求
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

  • 2)在web.xml中注册Filter接口的实现类
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--注册Filter-->
    <filter>
        <filter-name>HelloFilter</filter-name>
        <filter-class>com.atguigu.filter.HelloFilter</filter-class>
    </filter>
    <!--映射Filter-->
    <filter-mapping>
        <filter-name>HelloFilter</filter-name>
        <!--配置要拦截的路径-->
        <url-pattern>/index.jsp</url-pattern>
    </filter-mapping>
</web-app>
  • 3)发送请求,如果请求地址与web.xml配置文件的url-pattern标签中的配置的地址一致,那么过滤器就会自动调用doFilter方法拦截该请求
  • 4)可以通过doFilter方法中的参数FilterChain对象放行请求、
//拦截请求的方法
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("此山是我开,此树是我栽,要想从此过,留下买路财!");
        //放行请求
        filterChain.doFilter(servletRequest,servletResponse);
    }
  • 过滤器的作用
    • 请求到达请求的资源之前拦截请求
    • 满足要求放行请求
    • 在响应到达浏览器之前做一些其他的操作
  • 过滤器只拦截请求,不拦截响应

三、Filter的生命周期

  • Filter的生命周期即Filter对象从被创建到被销毁的过程
  • Filter的生命周期主要体现在以下方法中
    • 构造器
      • 服务器一启动就调用,说明服务器一启动就创建Filter对象
      • 在整个生命周期过程中只会调用一次,说明Filter也是单例的
    • init(FilterConfig filterConfig)
      • 服务器一启动就调用,用来初始化Filter对象
      • 在整个生命周期过程中只会调用一次
      • 该方法中参数filterConfig的作用
        • 1)获取Filter的名称
        • 2)获取Filter的初始化参数
        • 3)获取ServletContext对象
    • doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
      • 当发送的请求是标签中配置的拦截的路径的时候调用,用来拦截该请求
      • 在整个生命周期过程中可以调用多次
      • 该方法中参数的作用
        • servletRequest与servletResponse与Servlet中service()方法中的作用一样
        • filterChain参数的作用是放行请求
    • destroy()
      • 服务器关闭时调用
      • 在整个生命周期过程中只会调用一次

四、多个Filter的执行顺序

  • 我们可以为同一个资源配置多个Filter,多个Filter组成一个Filter链,多个Filter的执行顺序由web.xml配置文件中的标签决定,在前的先拦截,在后的后拦截
<!--注册Filter-->
    <filter>
        <filter-name>HelloFilter</filter-name>
        <filter-class>com.atguigu.filter.HelloFilter</filter-class>
    </filter>
    
    <!--注册Filter-->
    <filter>
        <filter-name>HelloFilter2</filter-name>
        <filter-class>com.atguigu.filter.HelloFilter2</filter-class>
    </filter>
    <!--映射Filter-->
    <filter-mapping>
        <filter-name>HelloFilter2</filter-name>
        <!--配置要拦截的路径-->
        <url-pattern>/index.jsp</url-pattern>
    </filter-mapping>

    <!--映射Filter-->
    <filter-mapping>
        <filter-name>HelloFilter</filter-name>
        <!--配置要拦截的路径-->
        <url-pattern>/index.jsp</url-pattern>
    </filter-mapping>

五、url-pattern的配置规则

  • 精确匹配
    • 配置一个完整的路径
      • 例如:/index.jsp
        • 当访问首页的时候就会被过滤器拦截
    • 除了可以通过url-pattern标签配置拦截的路径外,还可以通过标签配置
      • 例如:UserServlet
      • 等价于/UserServlet
        • 当向UserServlet发送请求时就会被过滤器拦截
  • 模糊匹配
    • 前缀匹配
      • 例如:/pages/*
        • 只要访问pages目录下的页面都会被过滤器拦截
    • 后缀匹配
      • 例如:*.jsp
        • 只要访问jsp页面都会被过滤器拦截
    • 但是以下配置的方式是无效的
      • 例如:/pages/*.jsp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值