javaFilter - juedaiyuer/researchNote GitHub Wiki
#过滤器#
可以实现一些特殊的功能,实现URL级别的权限访问控制,过滤敏感词汇,压缩响应信息...
访问的请求和响应进行拦截
过滤器的生命周期
- 实例化 Web.xml
- 初始化 init()
- 过滤 doFilter()
- 销毁 destroy()
开发步骤
- 编写java类实现Filter接口,并实现其doFilter方法
- 在web.xml文件中使用和元素对编写的filter类进行注册,并设置它所能拦截的资源
##demo##
使用JavaEE 5.0
选项中实现了过滤器接口.
init() 过滤器的初始化方法,Web容器创建过滤器实例后将调用这个方法.这个方法可以读取web.xml文件中过滤器的参数
doFilter() 当用户请求访问与过滤器相关联的URL时,Web容器将先调用该方法.FilterChain参数可以调用chain.doFilter方法,将请求传递给下一个过滤器(或者目标资源),或利用转发,重定向将请求转发到其它资源
destroy() ...大多数情况用不到
web.xml的配置
Design模块可以进行图形化操作
进行完配置之后,可以进行下面的程序测试
过滤器启动顺序测试程序
package com.juedaiyuer.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class myFilter implements Filter {
public void destroy() {
// 刷一下存在感
System.out.println("destroy");
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("start---doFilter");
arg2.doFilter(arg0, arg1); //让目标资源执行,放行
System.out.println("end---doFilter");
}
public void init(FilterConfig arg0) throws ServletException {
System.out.println("init");
}
}
FilterConfig对象
方法:
getFilterName()
getInitParameter()
getInitParameterNames()
注册Filter
用于为过滤器指定一个名字,该元素的内容不能为空。 元素用于指定过滤器的完整的限定类名。 元素用于为过滤器指定初始化参数,它的子元素指定参数的名字,指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。如果过滤器不需要指定初始化参数,那么元素可以不配置。
映射Filter
元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径 子元素用于设置filter的注册名称。该值必须是在元素中声明过的过滤器的名字 设置 filter 所拦截的请求路径(过滤器关联的URL样式) 指定过滤器所拦截的Servlet名称。 指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个 子元素用来指定 Filter 对资源的多种调用方式进行拦截。
多个过滤器
服务器会按照web.xml中过滤器定义的先后顺序组装成一条链
##分类##
servlet2.5
request过滤
用户直接访问页面时,web容器将会调用过滤器
如果目标资源是通过RequestDispatcher的include()或者forward()方法访问时,那么该过滤器就不会被调用
forward
如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
include
如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
error
如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。