过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。
它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术。
它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作。
常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。
2、Filter介绍- Filter是一个接口。如果想要实现过滤器功能,必须实现该接口!
- 核心方法
返回值 方法名 作用 void init(FilterConfig config) 初始化方法 void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
对请求资源和响应资源过滤 void destroy() 销毁方法 -
-
配置方式:
-
注解方式
-
配置文件
-
编写过滤器
public class FilterDemo1 implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String requestURI = req.getRequestURI();
if (requestURI.contains("favicon.ico")) {
return;
}
System.out.println("FilterDemo1拦截到了请求");
}
}
配置过滤器
FilterDemo1
com.itheima.web.filter.FilterDemo1
FilterDemo1
/*
注意: 我们在配置过滤器的拦截规则时,使用了/*,表明访问当前应用下任何资源,此过滤器都会起作用。除了这种全部过滤的规则之外,它还支持特定类型的过滤配置。(添加具体的过滤拦截页面)
4、FilterConfig介绍FilterConfig是一个接口,代表过滤器的配置对象,可以加载一些初始化参数。
核心方法:
| 返回值 | 方法名 | 作用 |
| String | getFilterName() | 获取过滤器对象名称 |
| String | getInitParameter(String key) | 根据key获取value |
| Enumeration | getInitParameterNames() | 获取所有参数的key |
| ServletContext | getServletContext() | 获取应用上下文对象 |
代码示例:
配置FilterDemo2
FilterDemo2 com.itheima.web.filter.FilterDemo2 filterInitParamName filterInitParamValue FilterDemo2 /ServletDemo1
在FilterDemo2的doFilter方法中添加下面的代码
//根据名称获取过滤器的初始化参数
String paramValue = filterConfig.getInitParameter("filterInitParamName");
System.out.println(paramValue);
//获取过滤器初始化参数名称的枚举
Enumeration initNames = filterConfig.getInitParameterNames();
while(initNames.hasMoreElements()){
String initName = initNames.nextElement();
String initValue = filterConfig.getInitParameter(initName);
System.out.println(initName+","+initValue);
}
//获取ServletContext对象
ServletContext servletContext = filterConfig.getServletContext();
System.out.println(servletContext);
//获取过滤器名称
String filterName = filterConfig.getFilterName();
System.out.println(filterName);
5、FilterChain
- FilterChain是一个接口,代表过滤器链对象。由Servlet容器提供实现类对象,直接使用即可。
- 过滤器可以定义多个,就会组成过滤器链。
- 核心方法:
如果有多个过滤器,在第一个过滤器中调用下一个过滤器,依次类推。直到到达最终访问资源。如果只有一个过滤器,放行时,就会直接到达最终访问资源。返回值 方法名 作用 void doFilter(ServletRequest request, ServletResponse response) 放行方法
-
配置方式
-
注解方式:@WebFilter(拦截路径)
-
配置文件方式
-
-
多个过滤器使用顺序:
的配置前后顺序决定过滤器的调用顺序,也就是由映射配置顺序决定。
- 创建:当应用加载实例化对象并执行init初始化方法。
- 服务:对象提供服务的过程,执行doFilter方法。
- 销毁:当应用卸载或服务器停止时,对象销毁,执行destroy方法。
我们的过滤器目前拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,需要我们配置。配置的方式如下:
9、过滤器与Servlet的区别FilterDemo1 com.itheima.web.filter.FilterDemo1 trueFilterDemo1 /ServletDemo1 REQUEST ERROR FORWARD INCLUDE ASYNC
| 方法/类型 | Servlet | Filter | 备注 |
|---|---|---|---|
| 初始化 方法 | void init(ServletConfig); | void init(FilterConfig); | 几乎一样,都是在web.xml中配置参数,用该对象的方法可以获取到。 |
| 提供服务方法 | void service(request,response); | void dofilter(request,response,FilterChain); | Filter比Servlet多了一个FilterChain,它不仅能完成Servlet的功能,而且还可以决定程序是否能继续执行。所以过滤器比Servlet更为强大。 在Struts2中,核心控制器就是一个过滤器。 |
| 销毁方法 | void destroy(); | void destroy(); |



