一、Filter 过滤
1. Filter什么是过滤器
1、Filter过滤器它是JavaWeb的三大组件之一
三大组件分别是: Servlet 程序、Listener监听器、Filter过滤器
2、Filter过滤器它是JavaEE 的规范。也就是接口
3、Filter过滤器它的作用是:拦截请求,过滤响应
拦截请求常见的应用场景有:
1、权限检查
2、日记操作
3、事务管理
……等等
2. Filter的初体验
用户登录之后都会把用户登录的信息保存到Session域中。所以要检查用户是否登录,可以判断Session中是否包含有用户登录的信息即可!!!
<%-- Created by IntelliJ IDEA. User: Jack Date: 2022/1/3 Time: 9:08 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% Object user = session.getAttribute("user"); if (user == null){ request.getRequestDispatcher("/login.jsp").forward(request,response); return; } %> </body> </html> 1
完整的体验
2.1 编写AdminFilter实现接口
package com.caq.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; public class AdminFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } /** * 拦截请求,然后做权限检查 * @param servletRequest * @param servletResponse * @param filterChain * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpSession session = httpServletRequest.getSession(); Object user = session.getAttribute("user"); //如果等于null,说明没有登录 if (user == null) { servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse); return; } else { //让程序继续往下访问用户的目标资源 filterChain.doFilter(servletRequest,servletResponse); } } @Override public void destroy() { } }
2.2在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"> <!-- fileter标签用于配置一个Filter过滤器 --> <filter> <filter-name>AdminFilter</filter-name> <filter-class>com.caq.filter.AdminFilter</filter-class> </filter> <!-- filter过滤器的拦截路径--> <filter-mapping> <filter-name>AdminFilter</filter-name> <!-- url-pattern配置拦截路径--> <!-- /表示请求地址为:http://ip:port/工程路径/ 映射到IDEA的web目录--> <!-- /admin/* 表示请求地址为http://ip:port/工程路径/admin/*--> <url-pattern>/admin/*</url-pattern> </filter-mapping> <servlet> <servlet-name>RegistServlet</servlet-name> <servlet-class>com.caq.servlet.RegistServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RegistServlet</servlet-name> <url-pattern>/registServlet</url-pattern> </servlet-mapping> <servlet> <servlet-name>KaptchaServlet</servlet-name> <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>KaptchaServlet</servlet-name> <url-pattern>/kaptcha.jpg</url-pattern> </servlet-mapping> </web-app>
2.3 打断点debug部署服务进行测试
可以看到首先经过的是filter过滤器
进行放行才会出现a.jsp的页面
3. Filter的生命周期
Filter的生命周期包含几个方法
1、构造器方法
2、init初始化方法
第1,2步,在 web工程启动的时候执行( Filter已经创建)
3、doFilter过滤方法
第3步,每次拦截到请求,就会执行
4、destroy销毁
第4步,停止 web工程的时候,就会执行(停止web工程,也会销毁Filter过滤器)
4. FilterConfig类
FilterConfig 类见名知义,它是Filter过滤器的配置文件类。
Tomcat每次创建Filter 的时候,也会同时创建一个FilterConfig类,这里包含了Filter配置文件的配置信息。
FilterConfig 类的作用是获取filter 过滤器的配置内容
1、获取Filter的名称filter-name 的内容
2、获取在 Filter 中配置的init-param初始化参数
3、获取ServletContext对象
5. FilterChain 过滤器链
FilterChain 就是过滤器链(多个过滤器如何一起工作)
6. Filter的拦截路径
精确匹配
<url-pattern>/target.jsp</url-pattern>
表示请求地址必须为:http://ip:port/工程路径/target.jsp
目录匹配
<url-pattern>/admin/*</url-pattern>
表示请求地址必须为:http://ip:port/工程路径/admin/*
后缀名匹配
<url-pattern>*.html</url-pattern> 表示请求地址必须是.html结尾才会拦截到 <url-pattern>*.do</url-pattern> 表示请求地址必须以.do结尾才会拦截到 <url-pattern>*.action</url-pattern> 表示请求地址必须以.action结尾才会拦截到
Filter过滤器只关心请求地址是否匹配不关心资源是否存在