写在前面:

使用Spring-Boot时,嵌入式Servlet容器可以通过扫描注解(@ServletComponentScan)的方式注册Servlet、Filter和Servlet规范的所有监听器(如HttpSessionListener监听器)。

Spring boot 的主 Servlet 为 DispatcherServlet,其默认的url-pattern为“/”。一般情况系统默认的Servlet就够用了,如果需要自定义Servlet,可以继承系统抽象类HttpServlet,重写方法来实现自己的Servlet。关于Servlet、过滤器、拦截器、监听器可以参考:(转)servlet、filter、listener、interceptor之间的区别和联系

Spring-Boot有两种方法注册Servlet、Filter和Listener :

1、代码注册:通过ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 获得控制。

2、在 SpringBootApplication 上使用@ServletComponentScan 注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。

一、Servlet

Servlet匹配规则:匹配的优先级是从精确到模糊,复合条件的Servlet并不会都执行。

1、通过@ServletComponentScan自动扫描

a、springboot的启动入口添加注解:@ServletComponentScan;

@SpringBootApplication
@ServletComponentScan
public class ApplicationMain {public static void main(String[] args) {SpringApplication.run(ApplicationMain.class, args);}
}

b、@WebServlet 自定义Servlet,配置处理请求路径 /demo/myServlet

@WebServlet(name = "myServletDemo1",urlPatterns = "/demo/myServlet",description = "自定义的servlet")
public class MyServletDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("==========myServletDemo Get Method==========");resp.getWriter().println("my myServletDemo1 process request");super.doGet(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("==========myServletDemo1 POST Method==========");super.doPost(req, resp);}
}

2、使用@ServletRegistrationBean注解

a、@ServletRegistrationBean注入自定义的Servlet,配置处理的路径为 /demo/servletDemo2

@Configuration
public class ServletConfiguration {/*** 代码注入*/@Beanpublic ServletRegistrationBean myServletDemo() {return new ServletRegistrationBean(new MyServletDemo2(), "/demo/servletDemo2");}
}

b、自定义的Servlet

public class MyServletDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("==========myServletDemo2 Get Method==========");resp.getWriter().println("my myServletDemo2 process request");super.doGet(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("==========myServletDemo2 POST Method==========");super.doPost(req, resp);}
}

二、Filter

完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

Filter有如下几个用处。

  • 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
  • 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
  • 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
  • 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

多个FIlter可以组成过滤器调用链,按设置的顺序逐一进行处理,形成Filter调用链。

1、通过@ServletComponentScan自动扫描

a、springboot的启动入口添加注解:@ServletComponentScan;

b、@WebFilter 配置处理全部url的Filter

@WebFilter(filterName = "myFilter",urlPatterns = "/*")
public class MyFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {System.out.println(">>>>>>myFilter init ……");}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println(">>>>>>执行过滤操作");filterChain.doFilter(servletRequest, servletResponse);}public void destroy() {System.out.println(">>>>>>myFilter destroy ……");}
}

* doFilter()方法是过滤器的核心方法,实现该方法就可实现对用户请求进行预处理,也可实现对服务器响应进行后处理——它们的分界线为是否调用了filterChain.doFilter(),执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。

2、通过@FilterRegistrationBean注册

a、@Bean注入自定义的Filter

@Configuration
public class ServletConfiguration {@Beanpublic FilterRegistrationBean myFilterDemo(){FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(new MyFilter2());registration.addUrlPatterns("/demo/myFilter2");registration.addInitParameter("paramName", "paramValue");registration.setName("myFilter2");registration.setOrder(2);//指定filter的顺序return registration;}
}

b、自定义的Filter

public class MyFilter2 implements Filter {public void init(FilterConfig filterConfig) throws ServletException {System.out.println("======MyFilter2 init ……");}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("======MyFilter2执行过滤操作");filterChain.doFilter(servletRequest, servletResponse);}public void destroy() {System.out.println("======MyFilter2 destroy ……");}
}

三、Listener

目前 Servlet 中提供了 6 种两类事件的观察者接口,它们分别是:4 个 EventListeners 类型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener 和 2 个 LifecycleListeners 类型的,ServletContextListener、HttpSessionListener。

  • ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。
  • ServletContextListener监听ServletContext。当创建ServletContext时,激发contextInitialized(ServletContextEvent sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。
  • HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。
  • HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。

1、通过@ServletComponentScan自动扫描

a、ServletListenerRegistrationBean 注入自定义的Listener;

b、自定义的Listener

@WebListener
public class MyLisener implements ServletContextListener {public void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("MyLisener contextInitialized method");}public void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("MyLisener contextDestroyed method");}
}

2、通过@ServletListenerRegistrationBean 注册

a、@Bean注入自定义的Listener;

@Configuration
public class ServletConfiguration {@Beanpublic ServletListenerRegistrationBean myListener(){return new ServletListenerRegistrationBean(new MyLisener());}
}

b、自定义的Listener

public class MyLisener implements ServletContextListener {public void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("MyLisener contextInitialized method");}public void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("MyLisener contextDestroyed method");}
} 

四、验证servlet、filter、listener的顺序

a、使用MyServletDemo2、MyFilter2、MyFilter3、MyLisener做测试;

b、设置servlet处理url格式为 /demo/*;设置MyFilter2顺序为2;MyFilter3的顺序为3;

@Configuration
public class ServletConfiguration {/**代码注入*/@Beanpublic ServletRegistrationBean myServletDemo(){return new ServletRegistrationBean(new MyServletDemo2(),"/demo/*");}@Beanpublic FilterRegistrationBean myFilterDemo(){FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(new MyFilter2());registration.addUrlPatterns("/demo/myFilter");registration.addInitParameter("paramName", "paramValue");registration.setName("myFilter2");registration.setOrder(2);//指定filter的顺序return registration;}@Beanpublic FilterRegistrationBean myFilterDemo2(){FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(new MyFilter3());registration.addUrlPatterns("/demo/*");registration.addInitParameter("paramName", "paramValue");registration.setName("myFilter3");registration.setOrder(1);return registration;}@Beanpublic ServletListenerRegistrationBean myListener(){return new ServletListenerRegistrationBean(new MyLisener());}
}

View Code

c、启动项目后输出:(FIlter2先执行init,因为@Ben在前)

MyLisener contextInitialized method
======MyFilter2 init ……
======MyFilter3 init ……

d、浏览器输入地址地址:http://localhost:8080/demo/myFilter,输出:

======MyFilter3执行过滤操作
======MyFilter2执行过滤操作
>>>>>>>>>>test Get Method==========

可以看出:

  1. Filter3比Filter2先执行;
  2. Filter可以匹配上的url都会执行,并且按顺序执行(Filter的调用链);
  3. Filter比servlet先执行。
  4. servlet先按具体匹配,然后模糊匹配,并且只能有一个servlet匹配上,没有servlet调用链。

执行顺序是:Listener》Filter》Servlet

五、ApplicationListener自定义侦听器类

参考:http://blog.csdn.net/liaokailin/article/details/48186331

六、Interceptor

拦截器只会处理DispatcherServlet处理的url

a、自定义拦截器

public class MyInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println(">>>>MyInterceptor preHandle");return true;}public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println(">>>>MyInterceptor postHandle");}public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println(">>>>MyInterceptor afterCompletion");}
}

b、注册拦截器

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");super.addInterceptors(registry);}
}

c、拦截器验证

输入地址:http://localhost:8080/home/test

>>>>MyInterceptor preHandle
>>>>MyInterceptor postHandle
>>>>MyInterceptor afterCompletion

输入地址:http://localhost:8080/demo/myFilter (自定义的Servlet处理了请求,此时拦截器不处理)

拦截器不处理。

转载于:https://www.cnblogs.com/mr-yang-localhost/p/7784607.html

Java的Servlet、Filter、Interceptor、Listener相关推荐

  1. Java Web之filter、listener、Interceptor

    ** 1.Servlet ** Servlet 是服务端的 Java 应用程序,用于处理HTTP请求,做出相应的响应. 当客户端向服务器发出HTTP请求时,首先会由服务器中的 Web 容器(如Tomc ...

  2. java listen_JavaWeb之Filter、Listener

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

  3. JAVA基础(16) Servlet/Filter/Listener/Interceptor区别与联系

    一.概念: 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.最早支持 Serv ...

  4. servlet/filter/listener/interceptor区别与联系

    2019独角兽企业重金招聘Python工程师标准>>> servlet/filter/listener/interceptor区别与联系 博客分类: java 由于最近两个月工作比较 ...

  5. servlet/filter/listener/interceptor区别与联系(转)

    由于最近两个月工作比较清闲,个人也比较"上进",利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时候,发现为什么struts1要用servle ...

  6. Servlet、Filter、Listener、Interceptor基础

    第一:Servlet Servlet是个接口,全限定名是javax.servlet.Servlet,在javax.servlet包中,在servlet-api.jar(在tomcat自带的lib文件夹 ...

  7. springboot_4 spring boot 使用servlet,filter,listener和interceptor

    上一篇我们学习了 spring boot 利用Controller响应数据与响应页面. 一般的Web开发使用 Controller 基本上可以完成大部分需求,但是有的时候我们还是会用到 Servlet ...

  8. Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)

    概述 web 服务器.项目.资源概述 web 服务器:可以被浏览器访问到的服务器 常见的 web 服务器: tomcat:中小型的服务器软件,免费开源,支持 JSP 和 Servlet apache ...

  9. java手动注册filter,SpringBoot如何注册Servlet、Filter、Listener的几种方式

    在Servlet 3.0之前都是使用web.xml文件进行配置,需要增加Servlet.Filter或者Listener都需要在web.xml增加相应的配置.Servlet 3.0之后可以使用注解进行 ...

最新文章

  1. 使用MS VS的命令来编译C++程序
  2. 初一模拟赛总结(2019.3.9)
  3. Flask 框架下 Jinja2 模板引擎高层 API 类——Environment
  4. oracle union all 特别慢_Oracle查询性能优化
  5. mysql创建表有则删除_MySQL创建表和删除表
  6. Windows中绕过更新直接关机
  7. 2-36进制,可以任意进制互转的类
  8. 通过tomcat插件启动Maven工程
  9. ITIL 4学习和实践导读
  10. 有道单词本添加js实现自动阅读单词
  11. ADXL361(微功耗三轴加速度计)使用笔记
  12. PostgreSQL获得去、今、明年份、今年的第一天、去年的第一天转换时区、最后一天等
  13. 第043篇:VBA之单元格简写与引用、值与地址
  14. 【2020.09.05】基金基础问题答疑汇总
  15. hotmail手机端_hotmail邮箱登陆手机版 参见http://help.
  16. Java中的偏向锁,轻量级锁, 重量级锁解析
  17. Express 报错:Failed to lookup view error in views directory 处理
  18. java2048小游戏源码及解析_200行java代码实现2048小游戏
  19. python坑爹的黑店_曝光米兰爱马仕黑店极其坑爹配货经验!大家不要再白白上当了!...
  20. 春节停车难?用Python找空车位

热门文章

  1. 链表排序c++代码_[链表面试算法](一) 链表的删除-相关题型总结(6题)
  2. windows 检查cuda安装_Windows云主机GPU驱动-CUDA安装使用
  3. python众数问题给定含有n个元素的多重集合s_分治法求众数 给定含有n个元素的多重集合S 联合开发网 - pudn.com...
  4. html 登陆sql server,jsp实现注册与登录页面+sqlsever2008
  5. flash php socket通信_php socket通信机制实例说明
  6. AEAP的完整形式是什么?
  7. 01背包怎么不重复_带有重复物品的背包
  8. ruby hash方法_Ruby中带有示例的Hash.length方法
  9. uva 10534——Wavio Sequence
  10. linux操作系统之条件变量