过滤器&监听器
监听器
Filter是实现特定接口的普通java程序,拦截Request请求的对象,在用户的请求访问资源前处理ServletRequest以及ServletResponse。
当浏览器发送请求给服务器的时候,先执行过滤器,然后才访问Web的资源。服务器响应Response,从Web资源抵达浏览器之前,也会途径过滤器。
Filter生命周期
- void init(FilterConfig):Filter实例会在服务器启动时就创建,创建完之后调用init()方法完成初始化。
- void doFilter(ServletRequest,ServletResponse,FilterChain):每次请求时执行,来决定释放用户是否能访问到目标资源。在doFilter中实现访问ServletRequest,ServletResponse。这也就意味着允许给ServletRequest增加属性或者增加Header。当然也可以修饰ServletRequest或者ServletResponse来改变它们的行为。
- void destory():一般服务器在关闭时销毁Filter对象,销毁之前调用destory()方法。
FilterConfig
init方法中FilterConfig参数的作用
filterConfig.getServletContext();//获取ServletConfig对象
filterConfig.getFilterName();//获取过滤器名字
filterConfig.getInitParameterNames();//获取初始值的name,返回值是枚举类型
filterConfig.getInitParameter("");//获取参数name对应的value值
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>FilterDemo1</filter-class>
<init-param>
<param-name>word_file</param-name>
<param-value>/WEB-INF/demo.txt</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
用于注册过滤器
:指定过滤器名称,filterConfig.getFilterName()返回这个值。
:指定过滤器对应的万盏的类名。
:指定过滤器初始化参数,filterConfig.getInitParameter("")方法用子元素指定的参数名字,返回指定的参数的值。
元素用于设置一个Filter 所负责拦截的资源。
:设置 filter 所拦截的请求路径
过滤器的执行顺序
一个资源可能被多个Filter关联到(Filter链条),这时调用Filter.doFilter()的方法将触发Filter链条中下一个Filter。只有当Filter链条中的最后一个Filter里调用的FilterChain.doFilter(),才会触发处理资源的方法。
的配置顺序决定了过滤器的执行顺序。如果是通过注解的方式配置,就比较urlPatterns的字符串优先级。
AFilter.java
public class AFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("AFilter#start");
filterChain.doFilter(request, response);// 触发下一个过滤器或者触发访问资源
System.out.