Filter的介绍
Filter过滤器是什么:Filter过滤器是JavaWeb的三大组件之一。它是JavaEE的规范。也就是接口
Filter过滤器的作用:拦截请求(主要),过滤响应。每当请求进来,都会先经过过滤器,我们可以在过滤器中加上自定义的功能,当请求满足某些条件时,才会通过过滤器继续往下访问,否则进行拦截。
拦截请求常见的应用场景有:
- 权限检查
- 日记操作
- 事务管理
- …
Filter过滤器的使用步骤
- 编写一个类实现Filter接口
- 重写doFilter()方法,实现具体的需求
- 到web.xml中去配置Filter的拦截路径
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* doFilter方法,专门用来拦截请求,过滤响应的。可以做权限检查
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//这里编写具体功能实现代码
}
@Override
public void destroy() {
}
}
其中init方法和destroy是初始化和销毁方法
xml配置
<!-- filter标签用于配置一个Filter过滤器 -->
<filter>
<!--给Filter起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--对应Filter的全类名-->
<filter-class>com.zhiqian.filter.AdminFilter</filter-class>
<!--配置Filter初始化参数-->
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
</filter>
<!--配置Filter过滤器的拦截路径-->
<filter-mapping>
<!--表示当前的拦截路径给哪个Filter使用-->
<filter-name>AdminFilter</filter-name>
<!--配置拦截路径
/ 表示请求地址为http://ip:port/工程路径/ 映射到IDEA的web目录
-->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
Filter的生命周期
Filter过滤器的生命周期会依次执行几个方法:
- 构造方法
- init初始化方法
- doFilter过滤方法
- destroy销毁方法
注意:
- 第1、2步在web工程启动时执行,Filter就被创建了
- 第3步每次拦截到请求就会执行
- 第4步在web工程停止时执行,Filter被销毁
FilterConfig类
FilterConfig类是Filter过滤器的配置文件类,可以用来获取Filter过滤器的配置信息
Tomcat每次创建Filter的时候,也会创建一个FilterConfig类
相关方法:
- getFilterName():获取Filter的名称(别名),就是filter-name的值
- getServletContext():获取ServletContext对象
- getInitParameter():获取在web.xml中配置的init-param 初识化参数
FilterChain类
FilterChain类:(过滤器链)就是多个过滤器如何一起工作
FilterChain类只有一个方法,就是doFilter()
FilterChain类的doFliter()的作用:
- 执行下一个Filter过滤器的doFilter方法(如果还有其他相同拦截路径的Filter)
- 执行请求路径的目标资源(没有其他相同拦截路径的Filter)
注意事项:多个相同拦截路径的Filter执行顺序,是由工程中的web.xml配置文件中从上往下配置的顺序决定的
多个Filter过滤器执行的特点:
- 所有的Filter和目标资源默认都执行在同一个线程中
- 多个Filter共同执行时,它们使用的是同一个request对象,共享request域中数据
Filter过滤器的拦截路径
Filter过滤器的拦截路径有三种匹配方式:
- 精确匹配
<url-pattern>/target.jsp</url-pattern>
以上这种就是精确匹配,请求的地址必须与上面的拦截地址一致
才会被拦截到
- 目录匹配
<url-pattern>/admin/*</url-pattern>
以上这种就是目录匹配,请求的地址在上面拦截地址的目录(admin)中就会被拦截到
- 后缀名匹配
<url-pattern>*.html</url-pattern>
以上就是后缀名匹配,只要请求访问后缀名为.html的资源就会被拦截到
注意:后缀名匹配,前面不要带 /
注意事项:
- 相同拦截路径的Filter必须是
<url-pattern>
中配置的路径相同。 - 如果当两个不同拦截路径的Filter遇到了一个二者都匹配的请求时,这时由web.xml中从上往下配置的顺序在决定谁去拦截请求。
- Filter过滤器它只关心请求的地址是否匹配,不关心服务器中是否存在该资源!
- 一个Filter过滤器可以配置多个拦截路径
ThreadLocal的使用
ThreadLocal可以解决多线程的数据安全问题,ThreadLocal它可以给当前线程关联一个数据(可以是普通变量、对象、数组、集合等)
ThreadLocal的特点:
- ThreadLocal可以为当前线程关联一个数据。它可以像Map一样存取数据,key为当前线程)
- 每个ThreadLocal对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要创建多个ThreadLocal对象实例。
- 每个ThreadLocal对象实例定义的时候,一般都是用static修饰
- ThreadLocal中保存的数据,在线程销毁后,由JVM虚拟机自动释放
ThreadLocal的应用:
可以在JDBCUtils工具类的getConnection方法中将数据库连接池获取到的连接对象保存在ThreadLocal中。使Dao层中一系列的方法使用的是ThreadLocal中的Connection以用来确保一个业务中使用的多个Service方法使用的是同一个Connection对象保证事务的一致性
最后补充:
- 使用Filter过滤器统一给所有的资源都加上try-catch,来实现事务的管理以及让Tomcat展示自定义的错误页面
- 使用Tomcat统一管理异常,让Tomcat展示友好的错误页面,在web.xml文件中配置标签
<error-page>
在其中配置错误类型以及对应跳转的页面