文章目录
- 过滤器的编写:
- [过滤器 API](#过滤器 API)
- 生命周期
- 过滤器核心方法的细节
- 多个过滤器执行顺序
- [<br />](#
)
过滤器------Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。
它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术。
它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作。
常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。
过滤器的编写:
java
@WebFilter(filterName = "FilterDemo2",urlPatterns = "/*")
public class FilterDemo1 implements Filter {
/**
* 过滤器的核心方法
* @param request
* @param response
* @param chain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
/**
* 如果不写此段代码,控制台会输出两次:FilterDemo1拦截到了请求。
*/
HttpServletRequest req = (HttpServletRequest) request;
String requestURI = req.getRequestURI();
if (requestURI.contains("favicon.ico")) {
return;
}
System.out.println("FilterDemo1拦截到了请求");
}
}
过滤器 API
Filter
返回类型 方法 简介
void init(FilterConfig conf) 用于执行过滤器的初始化工作,web容器会在web项目启动时自动调用该方法。
void doFilter(ServletRequest request,SerlvetResponse response,FilterChain chain) 当请求和响应被过滤器拦截后,都会交给doFilter来处理:其中两个参数分别是被拦截request和response对象,可以使用chain的doFliter方法来放行。
void destroy() 用于释放关闭Filter对象打开的资源,在web项目关闭时,由web容器自动调用该方法。
FilterConfig
FilterChain
生命周期
出生 当应用加载的时候执行实例化和初始化方法。
活着 只要应用一直提供服务,对象就一直存在。
死亡 当应用卸载时,或者服务器宕机时,对象消亡。
Filter的实例对象在内存中也只有一份。所以也是单例的。
过滤器核心方法的细节
java
/**
* 过滤器的核心方法
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
/**
* 如果不写此段代码,控制台会输出两次:FilterDemo1拦截到了请求。
HttpServletRequest req = (HttpServletRequest) request;
String requestURI = req.getRequestURI();
if (requestURI.contains("favicon.ico")) {
return;
}*/
System.out.println("FilterDemo1拦截到了请求");
//过滤器放行
chain.doFilter(request, response);
System.out.println("FilterDemo1放行之后,又回到了doFilter方法");
}
测试运行结果,我们发现过滤器放行之后执行完目标资源,仍会回到过滤器中:
多个过滤器执行顺序
运行结果