本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Filter
Filter过滤器是JavaWeb三大组件之一。是JavaEE的规范,也就是接口,它的作用是拦截请求,过滤响应。
拦截请求常见的应用场景有:
- 权限检查
- 日记操作
- 事务管理
- ……
以权限检查为例:
web工程下的一部分目录中内容需用户登陆后才可访问
在之前,解决方法是在jsp页面中用Java判断session域是否为空,若为空则代表用户未登录,跳转至登陆页面。但此方法有局限性,在一些图片、视频资源中无法用java代码进行判断,所以我们选择使用Filter过滤器进行权限检查。
Filter检查步骤:
检查用户是否登录→已登录则让程序默认执行,未登录就控制程序流转,跳转至其他页面
import javax.servlet.*;//注意这里是javax包下的
public class AdminFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException{
}
//doFilter方法,专门用于拦截请求,可以做权限检查
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain){
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
//然后就获取session域信息,判断是否登录
//让程序继续往下访问用户的目标资源
filterChain.doFilter(servletRequest,servletResponse);
}
}
在web.xml文件中配置Filter
<filter>
<!-- 给filter起别名 -->
<filter-name>AdminFilter</filter-name>
<!-- 配置filter的全类名 -->
<filter-class>com.atguigu.filter.AdminFilter</filter-class>
</filter>
<!-- 配置Filter过滤器的拦截路径 -->
<filter-mapping>
<!-- 标识当前的拦截路径给哪个filter使用 -->
<filter-name>AdminFilter</filter-name>
<!-- 配置拦截路径
/表示请求地址为:http://ip:port/工程路径/映射到IDER的web目录
/admin/*表示请求地址为:http://ip:port/工程路径/admin/*
-->
<url-pattern>/</url-pattern>
</filter-mapping>
使用步骤总结:
- 编写一个类去实现Filter接口
- 实现过滤方法doFilter()
- 到web.xml中去配置Filter的拦截路径
Filter生命周期
Filter的生命周期包含以下方法:
- 构造器方法
- init初始化方法
前两个方法在web工程启动的时候执行(Filter已经创建)
- doFilter过滤方法
第三个方法每次拦截到请求就会执行
- destroy销毁方法
停止web工程的时候会执行
FilterConfig类
FilterConfig类是Filter过滤器的配置文件类,Tomcat每次创建Filter的时候,也会同时创建一个FilterConfig类,这里包含了Filter配置文件的配置信息。
作用:
- 获取Filter的名称filter-name的内容
- 获取在Filter中配置的init-param初始化参数
- 获取ServletContext对象
FilterChain过滤器链
FilterChain.doFilter()方法的作用
- 执行下一个Filter过滤器(如果有)
- 执行目标资源(没有Filter)
方法前后代码执行顺序:
注意:
- 在多个Filter过滤器执行的时候,它们的执行顺序是由它们在web.xml中从上到下配置的顺序决定
- 如果没有doFilter方法,则会直接反向回去
- 所有filter和目标资源默认都执行在同一个线程中
- 多个Filter共同执行的时候,它们都使用同一个Request对象。
拦截路径的三种配置方式
精确匹配:
<url-pattern>/target.jsp</url-pattern>
目录匹配:
<url-pattern>/admin/*</url-pattern>
后缀名匹配:
<url-pattern>*.jsp</url-pattern>
后缀名匹配不能以“/”打头
Filter过滤器只关心请求的地址是否匹配,不关心请求的路径是否存在!