Javaweb中的过滤器Filter如何理解——精简
引言
今天给大家讲解的是我最近几天刚刚学习的过滤器Filter,而这也正是Javaweb中三大组件之一,因此也是相当重要的一部分。那么过滤器的作用是什么呢?我们可以简单地将其理解为安检人员,而当我们去请求资源的时候,则需要通过安检人员的检查才可以通过,通过以后才可以去寻找我们需要的资源。具体的解释我们在后面的文章来理解吧!
Filter入门
方法步骤: 1、创建一个类; 2、让该类实现Filter接口; 3、复写其接口中的方法; 4、设置过滤器的拦截路径。 @WebFilter("/*")//访问所有资源之前,都会执行过滤器 public class FilterDemo01 implements Filter { public void init(FilterConfig config) throws ServletException { } public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { system.out.println("FilterDemo01被执行。。。。") } } 此时我们启动服务器,访问请求资源index.jsp,可以看到这个结果: 控制台的输出表明了我们创建的过滤器FilterDemo01被执行了,而我们所访问的index.jsp并不能够成功访问,其原因就是过滤器对其拦截之后并没有对其放行,因此我们需要在拦截之后对其进行放行,需要在doFilter方法中添加一行代码“chain.doFilter(request, response);”用于对其请求的释放。此时我们再次访问资源index.jsp的结果为: 不仅在控制台显示了过滤器被执行了,并且在网页上也成功的访问了服务器的资源。这一部分可以让我们简单的了解Filter的基本知识。
执行流程&生命周期
执行流程
对于存在多个过滤器的的时候,它会存在一个怎样的执行流程呢?接下来我们通过一个简单的案列来理解其中的奥秘吧! 此时我们来创建两个Fliter过滤器,分别命名为FilterDemo02和FilterDemo03,并在释放代码的前后分别设置输出信息,以此来表明过滤器的执行流程是什么样的。 两个代码类似于: @WebFilter("/*") public class FilterDemo02 implements Filter { public void init(FilterConfig config) throws ServletException { } public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { System.out.println("FilterDemo02被执行。。。"); chain.doFilter(request, response); System.out.println("FilterDemo02已经释放。。。"); } } 其输出结果为: 通过结果我们可以看出来,案例2、3分别执行,然而却是3比2先释放? 首先呢,过滤器链(多个过滤器)的执行顺序是根据其名称而决定的,而名称的比较规则则是比较二者名称的字符串大小,谁靠前谁先执行,因此FilterDemo02要比03先执行,而03却比02先执行的原因是因为要遵守先进后出。
生命周期
通过对代码的观察我们可以看出来,其实Filter接口中的方法和我们之前学习的Servlet的方法类似,同样是具有初始化函数和销毁函数,因此我们只需要做简单的了解就足够了。 public class FilterDemo02 implements Filter { public void init(FilterConfig config) throws ServletException { //在服务器启动后,创建Filter对象,调用init()方法 } public void destroy() { //在服务器关闭后,Filter对象被销毁,如果服务器是正常关闭的,则会调用destroy()方法 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { chain.doFilter(request, response); } }
拦截路径配置
具体的资源路径:/index.jsp 只有在访问index.jsp这个资源的时候过滤器才会被执行 拦截目录:/user/* 访问/user下的所有资源的时候过滤器才会被执行 后缀名拦截:.jsp 访问后缀名为jsp的资源的时候,过滤器才会被执行 拦截所有资源:/ 访问所有资源,都会被拦截 具体的拦截方式就是这些,大家可以通过改变@WebFilter(" ")中的值