Filter
- 一、Filter 过滤
- 1. Filter什么是过滤器
- 2. Filter的初体验
- 2.1 编写AdminFilter实现接口
- 2.2在xml中配置访问路径
- 2.3 打断点debug部署服务进行测试
- 3. Filter的生命周期
- 4. FilterConfig类
- 5. FilterChain 过滤器链
- 6. Filter的拦截路径
- 精确匹配
- 目录匹配
- 后缀名匹配
一、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>
完整的体验
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过滤器只关心请求地址是否匹配不关心资源是否存在