【笔记】JavaWeb的Filter

前言

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;
...
}

获取初始化参数

  • init()方法中获取初始化参数
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个过滤器的响应处理

完成

参考文献

哔哩哔哩——黑马程序员