Filter简介
filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理
Filter实现流程图

Filter使用步骤
- 编写一个filter类实现Filter接口
- 完成接口中未实现的方法(主要是doFilter方法)
- 在web.xml配置Filter或者使用注释配置
FIilterApi
Filter生命周期
- 创建:服务器启动就创建该filter对象
- 销毁:服务器关闭filter就销毁
方法
init()
参数:FilterConfig,表示该过滤器的配置器信息的对象,内部封装是filter配置信息
package demo;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;
@WebFilter(filterName = "demoFilter", initParams = {@WebInitParam(name = "namespace", value = "demo")})
public class DemoFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
System.out.println(config.getInitParameter("namespace"));
}
}
运行结果:demo
在xml中配置初始化参数:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<filter>
<filter-name>demoFilter</filter-name>
<filter-class>demo.DemoFilter</filter-class>
<init-param>
<param-name>namespace</param-name>
<param-value>test</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>demoFilter</filter-name>
<servlet-name>demoServlet</servlet-name>
</filter-mapping>
</web-app>
doFilter()
参数:ServletReqeust ServletResponse FilterChain
- ServletRequest&ServletResponse:tomcat根据请求封装的reqeust以及response对象,等价于Servlet的Service方法参数reqeust以及response
- FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求
destory()
Filter对象销毁的时候执行
Filter配置
web.xml进行配置
配置指定访问的Servlet
配置访问指定servletA时执行Filter过滤器B
<filter>
<filter-name>B</filter-name>
<filter-class>demo.DemoFilterA</filter-class>
</filter>
<filter-mapping>
<filter-name>B</filter-name>
<servlet-name>A</servlet-name>
</filter-mapping>
配置指定访问的Url
配置访问指定url:/A
<filter>
<filter-name>B</filter-name>
<filter-class>demo.DemoFilterA</filter-class>
</filter>
<filter-mapping>
<filter-name>B</filter-name>
<url-pattern>/A</url-pattern>
</filter-mapping>
配置指定访问的Url范围比指定Servlet要大,建议使用url-pattern
url-pattern配置时
- 完全匹配: /servlet1
- 目录匹配: /aaa/bbb/*
- /user/*:访问前台的资源进入此过滤器
- /admin/*:访问后台的资源时执行此过滤器
- 扩展名匹配 *.abc *.jsp
配置初始化参数
<filter>
<filter-name>demoFilter</filter-name>
<filter-class>demo.DemoFilter</filter-class>
<init-param>
<param-name>namespace</param-name>
<param-value>test</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>demoFilter</filter-name>
<servlet-name>demoServlet</servlet-name>
</filter-mapping>
Servlet3.0注解配置
格式
@WebFilter(filterName="demo",urlPatterns="/*")
如需配置多个url:
@WebFilter(filterName="demo",urlPatterns={"/a" , "/b"})
配置扩展
参照Servlet3.0 注解相关属性
@WebServlet注解的相关属性
| NO. | 属性名 | 描述 |
|---|---|---|
| 1 | asyncSupported | 声明Servlet是否支持异步操作模式 |
| 2 | description | Servlet的描述信息 |
| 3 | displayName | Servlet的显示名称 |
| 3 | initParams | Servlet的初始化参数 |
| 5 | name | Servlet的名称 |
| 6 | urlPatterns | Servlet的访问URL |
| 7 | value | Servlet的访问URL |
Filter部署步骤
- 先配置Filter(web.xml或者annotation)
- 编写配置好的Filter类
- 完成doFilter()方法,内部功能