前言
JavaWeb中的Filter(过滤器、拦截器)学习笔记
通常将重复的操作在过滤器中完成,例如:权限校验、统一字符编码
定义一个Filter类
- 实现
javax.servlet.Filter
接口,并重写init()
、doFilter()
、destroy()
方法
1 2 3
| public class MyFilter implements Filter { ... }
|
请求过滤
- 在
doFilter()
中定义过滤规则,默认不放行,使用chain.doFilter(request, response)
方法手动放行
1 2 3 4 5 6 7 8 9 10 11 12 13
| public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request; ...
chain.doFilter(request, response); HttpServletResponse resp = (HttpServletResponse) response; ... }
|
获取初始化参数
1 2 3
| public void init(FilterConfig filterConfig) throws ServletException { filterConfig.getInitParameter("<key>"); }
|
Filter配置
通过xml配置
配置拦截范围
<url-pattern></url-pattern>
:定义拦截范围
/xxx.jsp
::拦截指定资源
/*.jsp
:拦截指定后缀的资源
/xxx/*
:拦截指定路径下的所有资源
/*
:拦截所有资源
1 2 3 4 5 6 7 8
| <filter> <filter-name></filter-name> <filter-class></filter-class> </filter> <filter-mapping> <filter-name></filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
|
配置请求转发过滤
<dispatcher>FORWARD</dispatcher>
:请求转发也会被过滤
1 2 3 4 5 6 7 8 9
| <filter> <filter-name></filter-name> <filter-class></filter-class> </filter> <filter-mapping> <filter-name></filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> </filter-mapping>
|
目标重定向也会被过滤
<dispatcher>REQUEST</dispatcher>
:目标重定向也会被过滤
1 2 3 4 5 6 7 8 9
| <filter> <filter-name></filter-name> <filter-class></filter-class> </filter> <filter-mapping> <filter-name></filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
|
过滤器初始化参数
<param-name></param-name>
:定义参数名
<param-value></param-value>
:定义参数值
1 2 3 4 5 6 7 8 9 10 11 12 13
| <filter> <filter-name></filter-name> <filter-class></filter-class> <init-param> <param-name></param-name> <param-value></param-value> </init-param> </filter> <filter-mapping> <filter-name></filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
|
通过注解配置
配置过滤范围
@WebFilter()
:配置拦截范围
/xxx.jsp
::拦截指定资源
/*.jsp
:拦截指定后缀的资源
/xxx/*
:拦截指定路径下的所有资源
/*
:拦截所有资源
1 2
| @WebFilter("/*") public class MyFilter implements Filter {
|
Filter链的执行流程
- 当出现了多个过滤器时,过滤器的执行流程组成了过滤器链
- 如果没有配置顺序,默认根据过滤器类名字符串的排序规则配置顺序
1
| 第1个过滤器的请求处理 -> 第2个过滤器的请求处理 -> 第n个过滤器的请求处理 -> 资源 -> 第n个过滤器的响应处理 -> 第2个过滤器的响应处理 -> 第1个过滤器的响应处理
|
完成
参考文献
哔哩哔哩——黑马程序员