Tomcat深入浅出——Filter与Listener(五)
一、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(五)的更多相关文章
- SpringBoot 源码解析 (七)----- Spring Boot的核心能力 - 自定义Servlet、Filter、Listener是如何注册到Tomcat容器中的?(SpringBoot实现SpringMvc的原理)
上一篇我们讲了SpringBoot中Tomcat的启动过程,本篇我们接着讲在SpringBoot中如何向Tomcat中添加Servlet.Filter.Listener 自定义Servlet.Filt ...
- Servlet、Filter、Listener、Interceptor
首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角 色,Interceptor是某些MVC框架中的角色,比如Str ...
- j2ee Servlet、Filter、Listener
首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,比如Stru ...
- JavaWeb之Filter、Listener
昨天和大家介绍了一下JSON的用法,其实JSON中主要是用来和数据库交互数据的.今天给大家讲解的是Filter和Listener的用法. 一.Listenner监听器 1.1.定义 Javaweb中的 ...
- SpringBoot中使用Servlet,Filter,Listener
项目最近在替换之前陈旧的框架,改用SpringBoot进行重构,初接触,暂时还没有用到Servlet,Filter,Listener的地方,但在之前回顾Servlet的生命周期时,https://ww ...
- SpringBoot 配置 Servlet、Filter、Listener
SpringBoot 配置 Servlet.Filter.Listener 在SpringBoot应用中,嵌入式的 Servlet 3.0+ 容器不会直接使用 ServletContainerInit ...
- spring boot(18)-servlet、filter、listener
servlet.filter.listener的用法就不讲了,只讲如何在spring boot中配置它们.有两种方式,一种是从servlet3开始提供的注解方式,另一种是spring的注入方式 ser ...
- Servlet、Filter、Listener总结
servlet规范提供了一组标准的servlet api.servlet容器就是servlet规范的实现. 1.In Action (1)写一个类继承HttpServlet: (2)重写其中的方法. ...
- Spring Boot (19) servlet、filter、listener
servlet.filter.listener,在spring boot中配置方式有两种:一种是以servlet3开始提供的注解方式,另一种是spring的注入方式. servlet注解方式 serv ...
随机推荐
- springmvc-02(配置版与注解版区别)
首先,我们来看配置版和注解版的相同步骤: 1.新建一个Moudle , springmvc-02-hello , 添加web的支持! 2.确定导入了SpringMVC 的依赖! 3.配置web.xml ...
- Spring Cloud Feign+Hystrix自定义异常处理
开启Hystrix spring-cloud-dependencies Dalston版本之后,默认Feign对Hystrix的支持默认是关闭的,需要手动开启. feign.hystrix.enabl ...
- c++动态内存分配需要注意的地方,可以不用尽量不用
在实际开发中,需要动态分配内存的场景极少,string和vector已经足够方便,如果不是非用不可的情况,采用动态分配内存就是给自己挖坑. 如果应用开发中一定要用动态内存分配技术,建议把它封装在类中, ...
- 透过实例demo带你认识gRPC
摘要:gRPC是基于定义一个服务,指定一个可以远程调用的带有参数和返回类型的的方法.在服务端,服务实现这个接口并且运行gRPC服务处理客户端调用. 本文分享自华为云社区<gRPC介绍以及spri ...
- 143. Reorder List - LeetCode
Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前 ...
- 图解Dijkstra(迪杰斯特拉)算法+代码实现
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...
- 题解 CF1095F 【Make It Connected】
题意简述 \(n\)( \(1≤n≤2×10^5\) )个点,每个点 \(i\) 有一个点权 \(a_i\) ( \(1≤a_i≤2×10^{12}\) ),将两个点 \(i\),\(j\) 直接相连 ...
- [USACO2021DEC] HILO 踩标做法
[USACO2021DEC] HILO Solution 参考自 官方题解 里提到的一篇 Obliteration.pdf,但是里面作者写出了极多错误...然后式子还错错得对了. 令 \(y=n-x\ ...
- Clash 规则的写法
这篇博文是针对 CFW 写的. 最近尝试从 v2 转向使用 Clash.基于一个简单的需求:用 Spotify 听专的时候用代理,用 AM 听专的时候直连,我参考了以下完成了我的规则: CFW 官网的 ...
- Navicat可视化MySQL数据库
Navicat可视化MySQL数据库 Navicat内部封装了所有的操作数据库的命令,用户只需要点击操作即可,无需书写sql语句. navicat能够充当多个数据库的客户端. 具体操作参考百度. py ...