七叶笔记 » java编程 » JavaWeb三大组件之一的Filter详解

JavaWeb三大组件之一的Filter详解

1. 概念

Filter过滤器是JavaWeb的三大组件之一。三大组件:Servlet,Listener,Filter

Filter过滤器是JavaEE的规范,即接口

作用:拦截请求,过滤响应

拦截请求常见的应用场景:

权限检查日记操作事务管理…

2. 基本使用

例子:要求在你的web工程下,有一个admin目录,这个目录下的所有资源(html,jpg,jsp等)都必须是用户登录之后才允许访问。

根据之前我们学的,用户登陆后我们把用户信息保存到Session域中,所以我们判断Session中是否包含有用户信息即可,但这种方案只能用在jsp页面中使用Filter,可以使用在任何资源上(Filter在获取目标资源前执行)

使用:

写个类去实现Filter接口

xml配置过滤器(和Servlet差不多)

3. 生命周期

Filter 的方法执行顺序:

构造器 方法init() 初始化方法, 第一二步在web工程启动的时候已经执行(即Filter已经创建)doFilter(),每次拦截到请求就会执行destroy(),停止web的时候执行

4. FilterConfig类

FIlterConfig,Filter过滤器的配置文件类,Tomcat每次创建的Filter的时候,会同时创建一个FilterConfig类。

作用:获取Filter过滤器的配置内容

获取Filter的名称,即配置文件中filter-name标签里面的内容获取Filter在web.xml中配置的init-param初始化参数 (在filter标签里面配置初始化参数,和Servlet一样)获取ServletContext对象

5. FilterChain类

FilterChain 是过滤器链(多个过滤器一起工作)

filterChain.doFilter(req, resp) 该方法是作用:

执行下一个Filter(如果有)执行目标资源(没有了Filter了)

如果验证通过,执行完目标资源后会返回 doFilter 方法调用的地方,继续执行下面的代码。

当多个过滤器时,拦截同一个文件/目录时,Filter 配置文件的顺序(即web.xml中的配置顺序)决定了每 Filter 的执行顺序,配置在前先执行。

当多个过滤器的特点:⭐

所有的 Filter 和目标资源默认都执行在同一个线程中多个 Filter 共同执行的时候他们都使用一个 Request 对象

6. 拦截路径

精确匹配

<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结尾

这个后缀名不一定是现有文件的后缀名,是个字符串就行 *.abc 也行。注意不是以斜杠开头

Filter只关系请求的地址是否匹配,不关心资源是否存在。

7. ThreadLocal+Filter管理事务

7.1 ThreadLocal

ThreadLocal是jdk1.2开始的,作用:可以解决多线程的数据安全问题

ThreadLocal可以给当前线程关联一个数据(可以是普通变量,对象,集合等)

(可以简单理解为,像Map一样,当前线程名为key,关联的数据为value)

如果想要给当前线程关联多个数据则需要多个ThreadLocal实例,ThreadLocal实例一般都是 static 类型,其中保存的数据在线程销毁后由JVM虚拟机自动释放。

7.2 MySQL事务前提

我们在book项目的时候,如果生成订单后发生错误,则生成订单成功而订单详情生成失败,这是严重错误的,所以我们要使用事务确保这些操作在一个事务内。

而确保在一个事务的前期是 使用同一个 Connection 连接对象! 这里就可以用 ThreadLocal 了,把Connection 存到ThreadLocal 中,确保多个Service使用的是同一个连接对象。

而使用 ThreadLocal 关联数据要确保上面这些操作在一个线程中执行! (经过验证我们book中生成订单操作都是在一个线程下的)

7.3 Filter统一管理

使用Filter统一给所有的 Service 方法都加上 try-catch,来实现管理!!

所有的异常都要抛给 Filter,不要私自处理异常

TransactionFilter.java :

web.xml

7.4 错误信息展示

TransactionFilter.java

web.xml配置

到此这篇关于JavaWeb三大组件之一的Filter详解的文章就介绍到这了,更多相关JavaWeb Filter内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!

相关文章