Javaweb中的过滤器Filter如何理解——精简

目录

引言

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("  ")中的值

拦截方式配置 

 在@WebFilter注解中除了拦截路径value属性之外,还有另一个属性dispatcherTypes,该属性是用于决定拦截方式的,其取值共有五种,如下:

  • REQUEST:默认值。浏览器直接请求资源
  • FORWARD:转发访问资源
  •  INCLUDE:包含访问资源
  • ERROR:错误跳转资源
  • ASYNC:异步访问资源

其中,前面两个是经常会使用的,所以后面三个在此就不再过多的赘述,只简单地说一下前面两个,首先第一个是默认值,当你向浏览器直接请求的时候会受到过滤器的拦截,其次是第二个值,当你转发请求的时候会受到过滤器的拦截,如果不是转发请求的话,就无法受到拦截。

 创作不易,给个三连

 ​​​​​​​

猜你喜欢

转载自blog.csdn.net/weixin_50635856/article/details/127078479
今日推荐