过滤器是 Servlet 的高级特性之一,是实现了 Filter 接口的 Java。过滤器位于浏览器与服务器端之间,充当滤网的作用,过滤或处理一些不恰当的请求。
过滤器的用处:过滤敏感字符串、避免中文乱码、权限验证(规定只带有Session或Cookie的用户才能访问)等等;
1 Filter
所有实现了 Filter 接口的类都称为过滤器。过滤器必须实现 Filter 下的三个方法:
方法 | 描述 |
---|---|
init() | 实例化过滤器时调用 |
doFilter() | 执行过滤操作 |
destroy() | 销毁过滤器时调用 |
其中,doFilter()
方法有三个参数 ServletRequest、ServletResponse 和 FilterChain,FilterChain 参数用于调用后续的过滤器,如果不存在过滤器,则访问目标资源;
2 创建过滤器
package servlet;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter被实例化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("执行doFliter方法");
//过滤器放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("MyFilter被销毁");
}
}
3 配置Filter
web.xml中配置
-
<filter>
指定一个过滤器-
<filter-name>
过滤器名称,不能为空; -
<filter-class>
过滤器的完整全限定类名; -
<init-param>
为过滤器指定初始化参数,子元素<param-name>
和<param-value>
用于指定参数的名和值;可用 FilterConfig 对象访问;
-
-
<filter-mapping>
设置一个Filter所负责拦截的资源;<filter-name>
过滤器名称,必须为<filter>
中声明过的名称<url-pattern>
所拦截请求的路径<servlet-name>
指定拦截的 servlet 名称-
<dispatcher>
指定过滤器所拦截的资源被 Servlet 调用的方式。默认为REQUEST:- REQUEST:当用户直接访问页面时,web容器将会调用过滤器,如果目标资源是通过
RequestDispatcher
的 include() 或 forward() 方法访问时,则该过滤器不会被调用; - INCLUDE:如果目标资源是通过
RequestDispatcher
的 include() 方法访问时,则调用该过滤器。除此之外,不调用该过滤器; - FORWARD:如果目标资源是通过
RequestDispatcher
的 forward() 方法访问时,则调用该过滤器。除此之外,不调用该过滤器; - ERROR:如果目标资源时通过声明时异常处理机制调用时,那么该过滤器被调用。否则,不会调用该过滤器。
- REQUEST:当用户直接访问页面时,web容器将会调用过滤器,如果目标资源是通过
4 过滤器的应用顺序
应用顺序是指根据请求地址执行对应的过滤器的顺序。执行拦截一个请求的过滤器是根据 web.xml中 <filter-mapping>
顺序从上往下执行,而且是嵌套执行的。
一个请求中,如果需要经过多个过滤器,其请求和响应的过程如下图所示
参考文章
-
java3y - GitHub
可关注大佬微信公众号:java3y