• 过滤器
    • 1.执行原理
    • 2.Filter的编写
    • 3.Filter的生命周期
    • 4.责任链设计模式

过滤器

1.执行原理

在正式学习过滤器之前,先来看看在没有学习过滤器的时候,简单的通信流程是怎么样的

那么我们为什么要学习这个技术呢,在没有学这个技术之前,我们在执行Servlet的时候,可能不同的Servlet之间有共同的方法,但是要分别写,这样无法达到代码的复用,我们使用过滤器就可以解决这样的问题
过滤器可以解决代码复用问题,我们一般在过滤器中写公共的代码,Filter可以在Servlet目标程序执行之前添加代码,也可以在执行之后添加代码,也就是添加过滤的原则

2.Filter的编写

这里以Tomcat10版本为例

  1. 写一个类实现jakarta.servlet.Filter接口,并且实现里面的方法
    init–在Filter对象第一次被创建之后调用,而且只调用一次
    doFilter–用户发送一次请求,就会执行一次方法,类似于Servlet的servlce方法,在这个方法中编写过滤原则
    destroy—在Filter对象被释放或销毁之前释放并且只执行一次
  2. 在web.xml中对Filter进行配置,这个配置和Servlet很相似
  3. 注意:
    Servlet对象默认在服务器启动的时候,是不会新建对象的
    Filter对象默认在服务器启动的时候,会新建对象
    Servlet和Filter都是单例的,都只创建一个对象
  4. 如果Servlet和Filter对应的路径是一样的,那么就会执行Filter,不会执行Servlet,如果想要让程序继续执行,就应该加上这样的代码
这个代码是我学习的时候用来测试的@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("Filter1的doFilter方法执行");//执行下一个过滤器,如果下一个不是过滤器,则执行目标程序//程序往下走,一定要有这个代码chain.doFilter(request, response);//在响应的时候添加过滤规则System.out.println("doFilter方法执行结束");}

在浏览器输入http://localhost:8080/filter/a.do

@WebFilter("/a.do")
public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("AServlet的doGet方法执行");}
}

程序执行结果

Filter1的doFilter方法执行
AServlet的doGet方法执行
doFilter方法执行结束
  1. 写请求路径的注意点:
    @WebFilter("*.do") 模糊匹配中的扩展匹配 这种路径不要以/开始,匹配所有以.do结尾的路径
    @WebFilter("/*")匹配所有路径 “/*”
    @WebFilter("/a/*")前缀匹配,匹配所有以a开头的路径
  2. 我们的目标Servlet程序如果想要执行,需要满足两个条件:
    1. 过滤器是否编写 chain.doFilter(request, response);
    2. 用户发送的请求路径是否和Servlet对应的路径一样
  3. chain.doFilter(request, response);的作用:
    执行下一个过滤器,如果没有,则执行最终的Servlet程序
  4. Filter优先级比Servlet高
  5. 在配置文件中,Filter的优先顺序问题
    如果在配置文件写了配置信息,根据<filter -mapping> 标签的位置,来判断优先顺序,从上往下优先级递减。
    如果是通过注解来配置,那么过滤器的优先顺序是根据过滤器的名字来定。FilterA比FilterB先执行,Filter1比Filter2先执行
  6. 过滤器调用顺序遵循栈数据结构

3.Filter的生命周期

Filter的生命周期和Servlet一致
有一点不同的是Filter在服务器启动的时候默认会创建对象,而Servlet不会

4.责任链设计模式

Filter这里涉及责任链设计模式,就类似下面的代码
不过下面的代码有一个问题,在编译阶段就已经把调用顺序确定了,如果我们想要改变调用顺序的话,就得改变源代码,违背OCP开闭原则

过滤器的优点就是在程序编译阶段,不会确定调用顺序,因为Filter调用顺序是配置到web.xml中,我们只需要修改配置文件 <filter - mapping >信息就可以改变Filter的执行顺序,Filter的执行顺序是在运行阶段动态组合的,这种设计模式叫做责任链设计模式。

责任链设计模式思想:程序运行阶段动态组合程序执行顺序。
过滤器一般配置在web.xml,而不是通过注解配置

JavaWeb--过滤器相关推荐

  1. javaweb过滤器_JavaWeb技术(2):SpringMVC中的Filter

    Filter顾名思义就是过滤器,在JavaWeb体系中,他在服务端,卡在请求/响应与Servlet之间做一些操作: 过滤器相关的类的顶层接口如下,以下方法都由Web容器自动调用: package 你可 ...

  2. JavaWEB过滤器和监听器技术

    过滤器介绍 什么是过滤器 生活中的例子: 滤水器,口罩,杯子上滤网,渔网 生活中的过滤器:留下我们想要的,排除,我们不想要的. 高考: 只有分数够高的同学才能进入理想的大学.有一部分同学被拦截在大学之 ...

  3. JavaWeb过滤器(Filter)

    开发工具与关键技术:javaWeb,过滤器(Filter) 撰写时间:2019-05-26 总结下述所有表达 第一点:过滤器是什么 第二点:客户端到服务端的流程 第三点:过滤器如何编写 第四点:Fil ...

  4. JavaWeb过滤器解决中文乱码问题

    文章目录 前言 一.创建过滤器的类 二.实现接口 1.EncodingFilter implements Filter 2.web.xml注册过滤器 3. 重新运行项目即可 前言 Javaweb三大组 ...

  5. JavaWeb过滤器的应用

    一:粗粒度权限控制(拦截是否登录.拦截用户名admin权限) 思路:过滤器能够在Web组件被调用之前检查ServletRequest对象,修改请求头或者请求的正文;过滤器能够在被Web组件调用之后检查 ...

  6. struts2 javaweb 过滤器、监听器 拦截器 原理

    转: 过滤器.监听器 拦截器 过滤器 创建一个 Filter 只需两个步骤: (1)创建 Filter 处理类: (2)在 web.xml 文件中配置 Filter . 创建 Filter 必须实现 ...

  7. JavaWeb过滤器(Filter)详解,是时候该把过滤器彻底搞懂了(万字说明)

            注意:这篇文章很长,学习完后将会解决你对于过滤器(Filter)的所有疑惑,下面将通过理论和代码的结合来进行讲解演示.....  目录 基本介绍 过滤器原理 过滤器(Filter)接口 ...

  8. javaweb项目中的过滤器的使用

    翻阅博客园的的时候,看到两篇关于javaweb过滤器的帖子写的很好,这里备忘一下: 过滤器基础:http://www.cnblogs.com/xdp-gacl/p/3948353.html 获取器案例 ...

  9. JavaWeb Filter 过滤器

    参考:JavaWeb过滤器(Filter)详解 1.简介 顾名思义就是对事物进行过滤的,在Web中的过滤器,当然就是对请求进行过滤,我们使用过滤器,就可以对请求进行拦截,然后做相应的处理,实现许多特殊 ...

  10. java中高级大公司多线程面试题

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...

最新文章

  1. SQLServer数据库试题及答案
  2. python与MySQL交互
  3. 产品「工具人」如何破局?
  4. 2020厦门大学845数据结构考研考试范围(大纲)和参考书目
  5. Thread Join 讲解
  6. 2021年95后“他经济”研究报告
  7. js / php 网站底部版权文字自动改变年份
  8. Windows Phone开发(27):隔离存储A 转:http://blog.csdn.net/tcjiaan/article/details/7425212...
  9. 深入理解JVM(4)——对象内存的分配策略
  10. ofstream 的中文目录问题
  11. Linux与云计算——第二阶段Linux服务器架设 第七章:网站WEB服务器架设—日志分析平台...
  12. win7怎么设置显示计算机,教您win7怎么设置分辨率
  13. iOS 的一种设计模式 类别 catagory
  14. 阿里云计算acp认证报考条件及需要具备的知识
  15. 极域课堂分发文件与一键开关机教程
  16. C/C++ 点和箭头操作符的区别
  17. 基于JAVA城市道路智能停车管理系统计算机毕业设计源码+系统+lw文档+部署
  18. matlab 运行报错:变量似乎随迭代次数而改变,请预先分配内存空间以加快运算速度 解决方式
  19. Maven的三种packaging方式(pom、jar、war)
  20. php如何每三位逗号分开,PHP 数字格式化,数字每三位加逗号的简单示例

热门文章

  1. mysql查询字段大小写结果相同,mysql大小写查询不敏感,mysql5.7查询不区分大小写解决方案。
  2. 前端Vue学习之路(二)-Vue-router路由
  3. 【Linux系统】基础总结
  4. PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战
  5. LeetCode简单题之长按键入
  6. LeetCode简单题之数组中第 K 个独一无二的字符串
  7. TensorRT 7.2.1 开发概要(上)
  8. 低层级GPU虚拟内存管理引论
  9. 使用IDEA开发Servlet程序
  10. 2021年大数据Hadoop(十):HDFS的数据读写流程