1. Filter 简介
Servlet 中的 Filter, 翻译成中文是过滤器, 实现了javax.servlet.Filter
接口的服务器端程序,
主要的用途 :
- 自动登录
- 统一设置编码格式
- 访问权限控制
- 敏感字符过滤等
2. Filter 基本使用
1. 实现 Filter 接口的自定义类,2. 使用注解 @WebFilter 对filter定义
2. 选择 new ==> create new Filter ==> 生成如下代码:
3. 创建完成后默认代码,可以看到,CharsetFilter实现了Filter接口,实现了3个方法。
3 个方法的作用已经在注释中写清楚了。
@WebFilter(filterName = "Filter01")
public class Filter01 implements Filter {
public void destroy() {
System.out.println("已摧毁 Filter...");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("Filter 被执行了...");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
System.out.println("初始化Filter...");
}
}
- 1. destory 方法,销毁时调用
- 2. 过滤方法 doFilter, 调用时执行, 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理
chain.doFilter(req, resp);//交给下一个过滤器或servlet处理
3. init 方法, 执行时创建 Filter 对象
2.1 还有一种方法,需要配置 xml 文件,但是这里不推荐,和 servlet xml配置完全一样, 因为比较繁琐,了解即可!
<!-- 解决乱码的问题 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
// 下面可以写多个url-pattern, /* 匹配所有路径
<url-pattern>/*</url-pattern>
</filter-mapping>
3. Filter 拦截配置项
- 以指定资源匹配。例如
" /index.jsp "
- 以目录匹配。例如
" /servlet/ * "
- 以后缀名匹配,例如
"* .jsp "
- 通配符,拦截所有web资源。
" / * "
initParams:
配置初始化参数,跟Servlet配置一样
例如:
initParams = {
@WebInitParam(name = "key",value = "value")
}
dispatcherTypes:
配置拦截的类型,可配置多个。默认为DispatcherType.REQUEST**
例如:
dispatcherTypes = {DispatcherType.ASYNC,DispatcherType.ERROR}
其中 DispatcherType 个枚举类型,有下面5个值
FORWARD, //转发的
INCLUDE, //包含在页面的
REQUEST, //请求的
ASYNC, //异步的
ERROR; //出错的
4. 多个Filter的执行顺序
在我们的请求到达Servle之间是可以经过多个Filter的,一般来说,建议Filter之间不要有关联,各自处理各自的逻辑即可。这样,我们也无需关心执行顺序问题。
如果一定要确保执行顺序,就要对配置进行修改了,执行顺序如下:
1. 在web.xml中,filter执行顺序跟<filter-mapping>的顺序有关,先声明的先执行
2. 使用注解配置的话,filter的执行顺序跟名称的字母顺序有关,例如AFilter会比BFilter先执行
3. 如果既有在web.xml中声明的Filter,也有通过注解配置的Filter,那么会优先执行web.xml中配置的Filter