文章目录
1、介绍
1.1 什么是Filter
Filter是JavaWeb的三大组件(Servlet、Listener、Filter)之一;它是JavaEE的规范;
作用是:拦截请求,过滤响应。
常见的应用场景有:
- 权限检查
- 日志操作
- 事务管理
1.2 工作流程
网页上某些页面或数据需要用户登录之后才能访问,使用Filter过滤器来过滤掉那些未登录的用户,避免该用户访问,只允许已登录的用户进行访问。
工作流程:
1.3 使用步骤
-
编写一个类去实现 Filter 接口 ;
-
实现过滤方法 doFilter();
public class MyFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpSession session = httpServletRequest.getSession(); User user = (User) session.getAttribute("user"); if(user == null){ //说明用户没有登录 //将用户页面跳转到登录页面 httpServletRequest.getRequestDispatcher("/pages/login.jsp").forward(servletRequest,servletResponse); return; } else{ //如果登录成功,说明该用户具有访问固定资源的权限 filterChain.doFilter(servletRequest,servletResponse); } } }
-
到 web.xml 中去配置 Filter 的拦截路径
<filter> <filter-name>myServlet</filter-name> <filter-class>com.wei.config.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myServlet</filter-name> <url-pattern>/admin/*</url-pattern> </filter-mapping>
<url-pattern>
为配置拦截路径:- / 表示请求地址为:http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
- /admin/* 表示请求地址为:http://ip:port/工程路径/admin/*
- *:表示所有类型的文件
1.4 生命周期
Filter过滤器的生命周期包括几个方法:
- 构造器方法;
- init初始化方法;
- doFilter()方法,每次遇到拦截请求时,就会执行该方法
- destroy()销毁方法,web工程停止后,就会销毁Filter过滤器
1.5 拦截路径
Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在。
<filter-mapping>
<filter-name>myServlet</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
```为配置拦截路径
Filter过滤器包括三种拦截路径的匹配方式
-
精确匹配:精确匹配到web目录下的某个具体的文件
<url-pattern>/login.jsp</url-pattern>
-
目录匹配
<url-pattern>/admin/*</url-pattern>
- / 表示请求地址为:http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
- /admin/* 表示请求地址为:http://ip:port/工程路径/admin/*
- *:表示所有类型的文件
-
后缀名匹配
<url-pattern>*.html</url-pattern> <url-pattern>*.jsp</url-pattern> <!--分别表示具有html和jsp结尾的文件才能被访问到 -->
2、Filter过滤器中的类
2.1 FilterConfig 类
表示过滤器的配置类。FilterConfig类的源码如下所示
package javax.servlet;
import java.util.Enumeration;
public interface FilterConfig {
//获取过滤器的名称
String getFilterName();
//获取Servlet的上下文对象
ServletContext getServletContext();
//获取web.xml中的init-paramter配置部分
String getInitParameter(String var1);
//获取init-paramter中的所有<param-name>标签中的值
Enumeration<String> getInitParameterNames();
}
Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里包含了 Filter 配置文件的配置信息。 FilterConfig 类的作用是获取 filter 过滤器的配置内容:
- 获取 Filter 的名称 filter-name 的内容
- 获取在 Filter 中配置的 init-param 初始化参数
- 获取 ServletContext 对象
- 获取init-paramter中的所有
<param-name>
标签中的值
2.2 FilterChain 过滤器链
FilterChain 过滤器链 描述的是多个过滤器如何进行工作。工作原理如下所示:
多个Filter过滤器执行的特点:
- 所有Filter和目标资源默认都执行在同一个线程中;
- 多个Filter共同执行的时候,它们都使用同一个Request请求对象。
FilterChain.doFilter()方法的作用
- 如果有Filter的话,就执行下一个Filter过滤器中的前置代码和chai.doFilter()方法;
- 如果后面没有Filter的话,就访问目标资源。
在多个Filter过滤器执行的时候,它们的执行顺序是根据web.xml中配置的Filter的顺序决定的。上面的Filter配置的执行在下面的Filter的执行的前面。