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


    目录

    引言

    Filter入门  

    执行流程&生命周期 

    执行流程

    生命周期 

    拦截路径配置 

    拦截方式配置 


     

    引言

             今天给大家讲解的是我最近几天刚刚学习的过滤器Filter,而这也正是Javaweb中三大组件之一,因此也是相当重要的一部分。那么过滤器的作用是什么呢?我们可以简单地将其理解为安检人员,而当我们去请求资源的时候,则需要通过安检人员的检查才可以通过,通过以后才可以去寻找我们需要的资源。具体的解释我们在后面的文章来理解吧!

     

    Filter入门  

    方法步骤:

    1、创建一个类;

    2、让该类实现Filter接口;

    3、复写其接口中的方法;

    4、设置过滤器的拦截路径。 

    1. @WebFilter("/*")//访问所有资源之前,都会执行过滤器
    2. public class FilterDemo01 implements Filter {
    3. public void init(FilterConfig config) throws ServletException {
    4. }
    5. public void destroy() {
    6. }
    7. @Override
    8. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    9. system.out.println("FilterDemo01被执行。。。。")
    10. }
    11. }

    此时我们启动服务器,访问请求资源index.jsp,可以看到这个结果:

    控制台的输出表明了我们创建的过滤器FilterDemo01被执行了,而我们所访问的index.jsp并不能够成功访问,其原因就是过滤器对其拦截之后并没有对其放行,因此我们需要在拦截之后对其进行放行,需要在doFilter方法中添加一行代码“chain.doFilter(request, response);”用于对其请求的释放。此时我们再次访问资源index.jsp的结果为:

     不仅在控制台显示了过滤器被执行了,并且在网页上也成功的访问了服务器的资源。这一部分可以让我们简单的了解Filter的基本知识。

    执行流程&生命周期 

    执行流程

             对于存在多个过滤器的的时候,它会存在一个怎样的执行流程呢?接下来我们通过一个简单的案列来理解其中的奥秘吧!

    此时我们来创建两个Fliter过滤器,分别命名为FilterDemo02和FilterDemo03,并在释放代码的前后分别设置输出信息,以此来表明过滤器的执行流程是什么样的。

    两个代码类似于:

    1. @WebFilter("/*")
    2. public class FilterDemo02 implements Filter {
    3. public void init(FilterConfig config) throws ServletException {
    4. }
    5. public void destroy() {
    6. }
    7. @Override
    8. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    9. System.out.println("FilterDemo02被执行。。。");
    10. chain.doFilter(request, response);
    11. System.out.println("FilterDemo02已经释放。。。");
    12. }
    13. }

    其输出结果为:

    通过结果我们可以看出来,案例2、3分别执行,然而却是3比2先释放?

            首先呢,过滤器链(多个过滤器)的执行顺序是根据其名称而决定的,而名称的比较规则则是比较二者名称的字符串大小,谁靠前谁先执行,因此FilterDemo02要比03先执行,而03却比02先执行的原因是因为要遵守先进后出。 

    生命周期 

    通过对代码的观察我们可以看出来,其实Filter接口中的方法和我们之前学习的Servlet的方法类似,同样是具有初始化函数和销毁函数,因此我们只需要做简单的了解就足够了。

    1. public class FilterDemo02 implements Filter {
    2. public void init(FilterConfig config) throws ServletException {
    3. //在服务器启动后,创建Filter对象,调用init()方法
    4. }
    5. public void destroy() {
    6. //在服务器关闭后,Filter对象被销毁,如果服务器是正常关闭的,则会调用destroy()方法
    7. }
    8. @Override
    9. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    10. chain.doFilter(request, response);
    11. }
    12. }

     

    拦截路径配置 

    • 具体的资源路径:/index.jsp 只有在访问index.jsp这个资源的时候过滤器才会被执行
    • 拦截目录:/user/* 访问/user下的所有资源的时候过滤器才会被执行
    • 后缀名拦截:.jsp 访问后缀名为jsp的资源的时候,过滤器才会被执行
    • 拦截所有资源:/ 访问所有资源,都会被拦截

    具体的拦截方式就是这些,大家可以通过改变@WebFilter("  ")中的值

    拦截方式配置 

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

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

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

     创作不易,给个三连

     ​​​​​​​

     

  • 相关阅读:
    C++容器之前向链表(std::forward_list)
    ASP.NET Core 6框架揭秘实例演示[12]:诊断跟踪的进阶用法
    SpringBoot Admin监控平台《二》基础报警设置
    Spring Cloud之微服务
    Laravel 响应对象深度解析:构建动态 HTTP 响应
    springboot集成mysql、mybatis-plus、shardingsphere-jdbc实现读写分离
    B-树(B-Tree)与二叉搜索树(BST):讲讲数据库和文件系统背后的原理(读写比较大块数据的存储系统数据结构与算法原理)...
    I2C知识大全系列三 —— I2C驱动之单片机中的I2C
    2022亚马逊云科技re:Invent科创风尚,抢占下一个万亿赛道
    echarts数值过多时X轴滚动显示,拖动一个表控制两个表同时滚动
  • 原文地址:https://blog.csdn.net/weixin_50635856/article/details/127078479