过滤器
- Filter称为过滤器,它是一个接口。web开发人员可以通过过滤器对web资源进行管理。例如可以对访问的jsp、静态的html以及servlet进行拦截。
- 功能:URL级别权限访问。过滤敏感词汇,压缩响应的信息。
创建一个过滤器
-
implements Filter接口,并注册过滤器
-
注册过滤器
<filter> <filter-name>TestFilter</filter-name> <filter-class>com.lovo.filter.TestFilter</filter-class> <init-param> <!--设置不需要过滤的 --> <param-name>NotFilterList</param-name> <param-value>/login.jsp,/LoginServlet</param-value> </init-param> </filter>
-
映射URL地址
<filter-mapping> <filter-name>TestFilter</filter-name> <!--过滤条件 /* 表示所有的都要进入这个过滤器--> <url-pattern>/*</url-pattern> <!-- 这里面写入的也是过滤条件。默认过滤 request请求,如果写的是FORWARD或INCLUDE则表示对应的内部派发要经过该过滤器--> <dispatcher>REQUEST</dispatcher> <filter-mapping>
-
在doFilter()方法中处理请求,是否要能到达目标资源---通过chain.doFilter(req,resp)控制。
-
FilterChain对象时Filter里面非常重要的一个对象,doFilter()和Filter接口里面的是不同的方法。
流程
- 所有符合过滤器的请求,进来会执行一段代码。
- 判断是否进入目标资源,进入目标资源处理业务。
- 返回过滤器再执行一段代码。
生命周期
- 容器在启动的过程中读取web.xml,找到过滤器配置创建实例
- 调用init方法做初始化
- 满足过滤器的请求都经过doFilter方法
- 容器关闭,销毁Filter
过滤器链
- 在web开发中,我们可以开发多个过滤器,这些过滤器组合起来就成为过滤器链。
- 过滤器里面的内容执行顺序和url配置没关系,和注册的顺序有关系,先注册的先进入。第一个过滤器执行过程中,调用chain.doFilter()方法会去找当前目标还有没有经过其他过滤器,没有就直接进入目标,如果目标程序还有第二个过滤器,那就进入第二个过滤器,嵌套执行。
<dispatcher>REQUEST</dispatcher>
- 这个标签表示指定过滤器所拦截的资源被servlet容器所调用的方式。
- REQUEST(默认):当前用户直接访问过滤器,web容器会调用过滤器
- INCLUDE:目标资源是通过requestDispater.include访问的,过滤器就会被调用,否则过滤器不会被调用
- FORWARD:目标是通过requestDispater.forward访问的,过滤器就会被调用,否则过滤器不会被调用