Filter
Filter
简介
Filter是对客户端访问资源的过滤,符合条件的放行,不符合条件的不放行,并且可以对目标资源访问前后进行逻辑处理的一个组件。
过滤器的作用
Java过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器可以对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改;也可以对响应进行过滤,拦截或修改响应。例如:修改响应体或是请求体的字符集。
快速入门
- 步骤:
- 使用Maven创建一个Web项目
- 导入
javax.servlet-api
依赖 - 编写一个过滤器继承
Filter
执行过滤操作 - 编写一个
Servlet
继承HttpServlet
执行业务处理操作 - 在
web.xml/
注解中进行配置(配置servlet
和filter
)
CharsetFilter.java
public class CharsetFilter implements Filter { |
ServiceServlet.java
public class ServiceServlet extends HttpServlet { |
web.xml
<!-- 注册servlet--> |
xml
配置
url-pattern
:代表要过滤的资源的匹配
filter-name
:过滤器名称 用于映射 于servlet-name
作用相同
filter-class
: 过滤器类的全限定名称
servlet-name
:代表要过滤的Servlet
的资源匹配
Filter的生命周期其与生命周期相关的方法
Filter接口有三个方法,这三个方法都与Filter的生命后期有关。
init(FilterConfig)
: 代表filter对象初始化方法,filter对象由tomcat
创建并且会将配置文件(web.xml
)生成一个FilterConfig
对象注入其中。doFilter(ServletRequest,ServletResponse,FilterChain)
: 代表filter对象执行过滤的核心方法如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter()
方法,与Servlet
的Service()
方法类似。destory()
: 代表filter销毁的方法,这里可以执行一些销毁前的操作, 当filter对象销毁时会执行这个方法。
Filter对象的生命周期
- Filter何时创建:服务器启动时就创建该filter对象
- Filter合适销毁: 服务器关闭时filter销毁
注意:Filter
与Servlet
一样都是默认单例的。
Filter相关API
init(FilterConfig)
Filter
创建时会去执行的init
方法- 参数
FilterConfig
代表该Filter
对象配置信息的对象,内部封装的是该Filter的配置信息。由Tomcat
创建该Filter对象时从配置文件中读取封装为一个FilterConfig
后注入。
destroy()
- filter对象销毁时执行
- 这里可以执行一些销毁前需要执行的操作,因为filter对象销毁时该方法会被执行
doFilter(ServletRequest,ServletResponse,FilterChain)
当该filter映射的
url-pattern
对应的资源被访问了 会执行该方法其中的参数
ServletRequest/ServletResponse
:每次在执行doFilter
方法时 web容器负责创建一个request
和一个response
对象作为doFilter
的参数传递进来。该request
和response
就是在访问目标资源的service
方法时的request
和response
。FilterChain
: 过滤器链对象, 通过该对象的doFilter
方法可以放行该请求,如果该过滤器上还有过滤器没有过滤该请求,那么转交给它,如果没有则直接到达Servlet
的service()
。
过滤器链
在一个 Web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以针对某一个 URL 进行拦截。如果多个 Filter 程序都对同一个 URL 进行拦截,那么这些 Filter 就会组成一个Filter 链(也称过滤器链)。
- 拦截顺序和过滤器
web.xml
注册顺序(filter-mapping
)一致。 - 由上图可知过滤器链过滤的顺序准许”先进后出”的原则。
过滤器链代码演示
Servlet.java
public class Servlet extends HttpServlet { |
Filter01.java
public class Filter01 implements Filter { |
Filter02.java
public class Filter02 implements Filter { |
web.xml
<servlet> |
控制台输出(可以看到 先进后出)
Filter
的url-pattern
配置
匹配单个资源
<filter>
<filter-name>filter02</filter-name>
<filter-class>filter.Filter02</filter-class>
</filter>
<filter-mapping>
<filter-name>filter02</filter-name>
<url-pattern>/filterServlet</url-pattern>
</filter-mapping>统配符匹配(最常使用)
<filter>
<filter-name>filter02</filter-name>
<filter-class>filter.Filter02</filter-class>
</filter>
<filter-mapping>
<filter-name>filter02</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>扩展名匹配 (
*.abc *.jsp
)注意不能和统配符混用<filter>
<filter-name>filter02</filter-name>
<filter-class>filter.Filter02</filter-class>
</filter>
<filter-mapping>
<filter-name>filter02</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>