web基础:过滤器
作者:互联网
一、概述
过滤器可以拦截请求,并控制响应,对此,servlet一无所知。与servlet非常类似,过滤器就是java组件,请求发送到servlet之前,可以用过滤器截获并处理请求,另外,servlet结束工作之后,在响应发回给客户端之前,可以用过滤器拦截并处理响应。
过滤器可以链接在一起,一个接一个的运行,过滤器并不关心他前面运行了哪些过滤器,也不关系他后边还会运行哪个过滤器。过滤器的运行顺序由web.xml部署文件控制。
二、过滤器的生命周期
过滤器必须实现Filter接口中的三个方法:
void init(FilterConfig var1) throws ServletException; void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; void destroy();
1. init()方法:
容器决定实例化一个过滤器时,在init()方法中完成调用过滤器之前的所有初始化任务。例如,保存一个FilterConfig对象的一个引用。
2. doFilter()方法:
每次容器认为应该对当前请求应用过滤器时,就会调用doFilter()方法,doFilter()方法中做过滤器具体的工作。
3. destroy()方法:
容器决定删除一个过滤器实例时,会调用destroy()方法,可以在该方法中做实例被撤销之前的一些清理工作。
三、FilterChain
前文中提到过,过滤器可以链接在一起,共同完成一些事情,达到这一目的主要依靠FilterChain。我们知道,过滤器并不知道请求所涉及到的其他过滤器,那么如何保证过滤器链接的顺序性呢?通过FilterChain可以,FilterChain知道过滤器执行的顺序。
过滤器的调用顺序可以以栈上的方法进行理解,如下图所示:
四、示例
<!-- 过滤器 -->
<filter>
<filter-name>BeerRequest</filter-name>
<filter-class>com.wyf.filter.BeerRequestFilter</filter-class>
<init-param>
<param-name>LogFileName</param-name>
<param-value>UserLog.txt</param-value>
</init-param>
</filter>
<!-- 过滤器映射 -->
<filter-mapping>
<filter-name>BeerRequest</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
/**
* 过滤器,非常类似于servlet
*/
public class BeerRequestFilter implements Filter {
private FilterConfig fc; //配置
/**
* 初始化,通常只需要在其中保持配置config
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.fc = filterConfig; //保持配置filterConfig
System.out.println("过滤器初始化!");
}
/**
* 过滤器做的具体的工作
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpreq = (HttpServletRequest)servletRequest;
String name = httpreq.getRemoteUser();
if(name!=null){
fc.getServletContext().log("User"+name+" is updating!");
}
filterChain.doFilter(servletRequest,servletResponse); //接下来要调用的过滤器或servlet
}
/**
* 销毁
*/
@Override
public void destroy() {
System.out.println("过滤器销毁,完成清理工作!");
}
}
标签:web,ServletException,void,基础,doFilter,过滤器,servlet,throws 来源: https://blog.csdn.net/sssxlxwbwz/article/details/123627550