一篇搞定Java过滤器
Filter:过滤器引言
(一) 过滤器概述过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中我们认为的杂质(用户自己定义的)过滤,符合条件的放行,不符合的则拦截下来 当然,过滤器既可以拦截request,也可以拦截返回的response,我们来看一张图 (二) 第一个过滤器程序过滤器的本质就是一个实现了 Filter 接口的 Java 类 我们先自己创建一个类,实现Filter接口(javax.servlet),重写其中的所有方法 @WebFilter("/*") public class FilterDemo1 implements Filter { public void destroy() { } public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) throws ServletException,IOException { //放行代码 chain.doFilter(req,resp); } public void init(FilterConfig config) throws ServletException { } } 我们先不探究其中的方法,我们先看一下如何配置filter (三) filter配置第一种:web.xml配置<filter> <filter-name>filterDemo1</filter-name> <filter-class>package cn.ideal.web.filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>filterDemo1</filter-name> <!-- 拦截路径 --> <url-pattern>/*</url-pattern> </filter-mapping> filter
filter-mapping
拦截路径设置
由于过滤器内设置的是比较通用的一些设置,所以一般来说使用 拦截方式配置:dispatcher拦截方式配置也就是资源被访问的形式,有这么几个属性
补充:声明式异常处理即:在web.xml中通过配置来确定不同的异常类型将如何被处理,最后跳转到哪个页面,也就是我们常常看到的一些404错误页面 <error-page> <!--异常的类--> <exception-type>xxx</exception-type> <!--异常发生时跳转的页面--> <location>xxx</location> </error-page> 第二种:使用注解配置与servlet相似的配置 ,我们可以指定它的名字和拦截路径 @WebFilter("filterName="FilterDemo1",urlPatters="/*") 但是直接在类上声明注解,显然那我们是不需要指定其名字的,而通过查看源码又可以知道,urlPatters又可以被value指定,而value又可以省略,所以我们可以简写为 @WebFilter("/*") 若想在filter注解中配置dispatcher,我们需要设置dispatcherTypes属性 @WebFilter(value = "/*",dispatcherTypes ={DispatcherType.FORWARD,DispatcherType.FORWARD} ) (四) 过滤器的生命周期讲完了配置,下面我们就回归主题来说一说过滤器的生命周期,也就是上面实现接口而重写的那些方法们 首先是 其实就这两个方法来说在Servlet的基础上还是很好理解的 再者就是我们过滤器的核心方法了: void doFilter(ServletRequest req,FilterChain chain) doFilter方法就是我们真正进行拦截的方法,通过前两个参数我们可以知道,不论是Request亦或是Respone我们都可以对其进行过滤操作,那么第三个参数是什么意思呢? 我们打开FilterChain的源码 public interface FilterChain { void doFilter(ServletRequest var1,ServletResponse var2) throws IOException,ServletException; } 嗯!FilterChain是一个接口,接口内也定义了一个doFilter方法,它存在的意义是什呢? 这是一种链式结构,我们在这里称作过滤器链,其作用就是为了配置多个过滤器,多个过滤器下的执行流程是这样的 |