一、Filter过滤器

1.1 Filter过滤器的使用

  • 这是过滤器接口的方法
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
} void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; default void destroy() {
}
}
  • 一般情况下我们都在过滤器中添加公共的代码
  • 例如我们经常设置字符编码utf-8,为了减少重复的操作,我们直接在过滤器中设置即可。
@WebFilter("/*")
public class MyFilter implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException {
//在Filter对象第一次被创建的时候调用,并且只调用一次
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//doFilter()只要用户发送一次请求,则执行一次,发送N次,则执行N次。在这个方法中编写过滤规则
System.out.println("doFilter方法,前1");
//解决跨域问题
HttpServletResponse resp = (HttpServletResponse) servletResponse;
resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Headers", "*");
resp.setHeader("Access-Control-Allow-Method", "*"); //执行下一个过滤器,如果说下一个不是过滤器,则会执行servlet
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("doFilter方法,后1");
} @Override
public void destroy() {
//在Filter对象被释放/销毁之前调用,并且只调用一次
System.out.println("destroy方法");
}
}
  • init方法:在Filter对象第一次被创建的时候调用,并且只调用一次

  • doFilter方法:只要用户发送一次请求,则执行一次,发送N次,则执行N次。在这个方法中编写过滤规则

  • destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次

  • filterChain.doFilter(request, response);执行下一个过滤器,如果下一个不是过滤器,则执行Servlet

目标Servlet是否执行取决于两个条件:

  • 过滤器中是否编写了filterChain.doFilter(request, response);
  • 用户发的请求路径是否和Servlet的请求路径一致

注意:

  • Filter的优先级天生就比Servlet高
  • 使用@WebFilter的时候,Filter执行顺序根据类名顺序执行。
  • Filter的生命周期与Servlet一样,但是Filter会在服务器启动的时候就默认创建对象,而Servlet却需要配置才可以。
  • 如果在web.xml中配置两个或者多个过滤器时,执行顺序根据<filter-mapping>的先后。

1.2 Filter的责任链设计模式

  • 我们先来看一下两个过滤器的运行过程是什么样的

  • Filter过滤器的doFilter方法,执行顺序遵循的是栈结构,但是过滤器本身的生命周期就和队列差不多吧。
  • 其实doFilter方法,就是一种责任链设计模式!
//模仿栈
//模仿Filter设计模式
//缺点:在编译阶段已经完全确定了调用关系
//如果想要改变调用顺序,必须要修改java代码
//违背了OCP原则(开闭原则)
public class Test {
public static void main(String[] args) {
System.out.println("main方法执行");
m1();
System.out.println("main执行完毕");
}
public static void m1() {
System.out.println("m1方法执行");
m2();
System.out.println("m1执行完毕");
}
public static void m2() {
System.out.println("m2方法执行");
m3();
System.out.println("m2执行完毕");
}
public static void m3() {
System.out.println("目标正在执行中");
}
}

  • 这是执行的结果,是不是和Filter一样~~~

二、Listener监听器

  • 监听器顾名思义:起到了监听的作用,我想大家在javaGUI部分也了解过吧。
  • 监听器可以监测我们网站时时的在线人数等等
  • 监听器加上@WebListener注解或者在web.xml中配置一下即可,并不需要我们程序员去调用
  • 下面是一个session监听器
@WebListener
public class MyListener01 implements HttpSessionAttributeListener { //监听session行为的监听器
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("add");
} @Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("removed");
} @Override
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("replaced");
}
}
  • 下面是监听整个Servlet生命周期的监听器
@WebListener
public class MyListener implements ServletContextListener { //监听整个servlet生命周期的监听器
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("contextInitialized");
} @Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("contextDestroyed");
}
}
  • 感觉用途不是特别多,我了解的也比较少,就先介绍这么多,感谢你的认真阅读

三、结尾

  • 对于Tomcat的Servlet内容就总结这么多,若想深入学习等待后续更新。
  • 我将会继续更新关于Java方向的学习知识,感兴趣的小伙伴可以关注一下。
  • 文章写得比较走心,用了很长时间,绝对不是copy过来的!
  • 尊重每一位学习知识的人,同时也尊重每一位分享知识的人。
  • 你的点赞与关注,是我努力前行的无限动力。

Tomcat深入浅出——Filter与Listener(五)的更多相关文章

  1. SpringBoot 源码解析 (七)----- Spring Boot的核心能力 - 自定义Servlet、Filter、Listener是如何注册到Tomcat容器中的?(SpringBoot实现SpringMvc的原理)

    上一篇我们讲了SpringBoot中Tomcat的启动过程,本篇我们接着讲在SpringBoot中如何向Tomcat中添加Servlet.Filter.Listener 自定义Servlet.Filt ...

  2. Servlet、Filter、Listener、Interceptor

    首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角 色,Interceptor是某些MVC框架中的角色,比如Str ...

  3. j2ee Servlet、Filter、Listener

    首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,比如Stru ...

  4. JavaWeb之Filter、Listener

    昨天和大家介绍了一下JSON的用法,其实JSON中主要是用来和数据库交互数据的.今天给大家讲解的是Filter和Listener的用法. 一.Listenner监听器 1.1.定义 Javaweb中的 ...

  5. SpringBoot中使用Servlet,Filter,Listener

    项目最近在替换之前陈旧的框架,改用SpringBoot进行重构,初接触,暂时还没有用到Servlet,Filter,Listener的地方,但在之前回顾Servlet的生命周期时,https://ww ...

  6. SpringBoot 配置 Servlet、Filter、Listener

    SpringBoot 配置 Servlet.Filter.Listener 在SpringBoot应用中,嵌入式的 Servlet 3.0+ 容器不会直接使用 ServletContainerInit ...

  7. spring boot(18)-servlet、filter、listener

    servlet.filter.listener的用法就不讲了,只讲如何在spring boot中配置它们.有两种方式,一种是从servlet3开始提供的注解方式,另一种是spring的注入方式 ser ...

  8. Servlet、Filter、Listener总结

    servlet规范提供了一组标准的servlet api.servlet容器就是servlet规范的实现. 1.In Action (1)写一个类继承HttpServlet: (2)重写其中的方法. ...

  9. Spring Boot (19) servlet、filter、listener

    servlet.filter.listener,在spring boot中配置方式有两种:一种是以servlet3开始提供的注解方式,另一种是spring的注入方式. servlet注解方式 serv ...

随机推荐

  1. 从0开始用webpack开发antd,react组件库npm包并发布

    一.初始化一个npm包 1.新建一个文件夹(名称随意,建议和报名一致),输入命令 :npm init -y 会自动生成一个包的说明文件 package.json如下(本文以scroll-antd-ta ...

  2. python学习-Day16

    目录 今日内容详细 内置函数补充 常见内置函数 help() id() int() isinstance() pow() round() sum() 求和 迭代器 可迭代对象 什么是可迭代对象? 哪些 ...

  3. python学习-Day6

    目录 学习内容详述 上期 '猜年龄'练习详解: while循环补充 while + else 死循环与while的嵌套 while嵌套 for循环 range关键字 range用法 什么是爬虫??? ...

  4. HTML5 Canvas 超逼真烟花绽放动画

    各位前端朋友们,大家好!五一假期即将结束,在开启加班模式之前,我要给大家分享一个超酷超逼真的HTML5 Canvas烟花模拟动画.这次升级版的烟花动画有以下几个特点: 烟花绽放时,将展现不同的色彩,不 ...

  5. Docker系列教程04-Docker构建镜像的三种方式

    简介 创建镜像的方法主要有三种:基于已有镜像的容器创建.基于本地模板导入.基于Dockerfile创建. 今天就逐一讲述为大家讲述,如何构建属于自己的docker镜像. 1.基于容器构建镜像 基于已有 ...

  6. WSL与Windows环境共享

    Reference 更多cmd.exe帮助参考 cmd_helps WSL备份及windows Docker安装 WSL安装维护 在使用wsl时,总是需要执行windows的cmd,但是windows ...

  7. 【Rust】使用HashMap解决官方文档中的闭包限制

    问题概述 值缓存是一种更加广泛的实用行为,我们可能希望在代码中的其他闭包中也使用他们.然而,目前 Cacher 的实现存在两个小问题,这使得在不同上下文中复用变得很困难. 第一个问题是 Cacher  ...

  8. [Java反序列化]jdk原生链分析

    jdk原生链分析 原文链接 作为jdk中目前发现的原生链,还是有必要要分析这个用法的.全文仅限尽可能还原挖掘思路 JDK7u21 在很多链中,TemplatesImpl一直发挥着不可或缺的作用,它是位 ...

  9. 详解TCP三次握手(建立TCP连接过程)

    在讲述TCP三次握手,即建立TCP连接的过程之前,需要先介绍一下TCP协议的包结构. 这里只对涉及到三次握手过程的字段做解释 (1) 序号(Sequence number) 我们通过 TCP 协议将数 ...

  10. 课堂练习——neo4j简单使用

    启动neo4j: neo4j.bat console 进入neo4j数据库的conf目录下,编辑neo4j.conf文件:将当前数据库设置为你要建立的数据库名称(数据库不能重名): dbms.acti ...