Filter 过滤器

参考:https://www.bilibili.com/video/BV1Y7411K7zz?p=293&vd_source=09e3f81b9f7ed8ee4306bb2e0ecd5538

一、什么是 Filter 过滤器?

1、Filter 过滤器它是JavaWeb 的三大组件之一,分别是:Servlet 程序、Listener 监听器、Filter 过滤器。
2、Filter 过滤器它是JavaEE 的规范,也就是接口。
3、Filter 过滤器它的作用是:拦截请求,过滤响应。

拦截请求常见的应用场景有:

1、权限检查
2、日记操作
3、事务管理
……

二、如何使用 Filter

2.1 写一个 Filter 类,并标识 @WebFilter注解

package com.atguigu.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author: sjmp1573
 * @date: 2022/7/23 21:23
 * @description:
 */
@WebFilter
public class AdminFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpSession session = httpServletRequest.getSession();
        if (session.getAttribute("user") == null) {
            request.getRequestDispatcher("/login.html").forward(request, response);
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

2.2 在web-xml 中配置

<?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-name>AdminFilter</filter-name>
        <filter-class>com.atguigu.filter.AdminFilter</filter-class>
        <init-param>
            <param-name>book1</param-name>
            <param-value>book1</param-value>
        </init-param>
        <init-param>
            <param-name>book2</param-name>
            <param-value>book2</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>AdminFilter</filter-name>
        <url-pattern>/admin/*
    

2.3 编写一个登录权限校验是Servlet

package com.atguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author: sjmp1573
 * @date: 2022/7/23 22:30
 * @description:
 */

@WebServlet(name = "adminServlet", value = "/adminServlet")
public class AdminServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        HttpSession session = req.getSession();
        if (username.equals("admin") && password.equals("admin")) {
            if (session.getAttribute("user") == null) {
                // 请求参数 == null ,说明是第一次登录
                session.setAttribute("user",username);
            }
            resp.getWriter().write("ok!!!");
        } else {
            req.getRequestDispatcher("login.html").forward(req, resp);
        }
    }
}

三、Filter 的生命周期

Filter 的生命周期包含几个方法
1、构造器方法
2、init 初始化方法
第1,2 步,在web 工程启动的时候执行(Filter 已经创建)
3、doFilter 过滤方法
第3 步,每次拦截到请求,就会执行
4、destroy 销毁
第4 步,停止web 工程的时候,就会执行(停止web 工程,也会销毁Filter 过滤器)

四、FilterConfig 类

FilterConfig 类见名知义,它是Filter 过滤器的配置文件类。

Tomcat 每次创建Filter 的时候,也会同时创建一个FilterConfig 类,这里包含了Filter 配置文件的配置信息。

FilterConfig 类的作用是获取filter 过滤器的配置内容

1、获取Filter 的名称filter-name 的内容
2、获取在Filter 中配置的init-param 初始化参数
3、获取ServletContext 对象

五、FilterChain 过滤器链

Filter 过滤器_第1张图片

六、Filter 的拦截路径

  • 精确匹配
    /target.jsp
    以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

  • 目录匹配
    /admin/*
    以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

  • 后缀名匹配
    *.html
    以上配置的路径,表示请求地址必须以.html 结尾才会拦截到

Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!

你可能感兴趣的:(学习笔记,Java基础,servlet,java,开发语言)