写在前面:

使用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

@ServletComponentScanpublic classApplicationMain {public static voidmain(String[] args) {

SpringApplication.run(ApplicationMain.class, args);

}

}

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

@WebServlet(name = "myServletDemo1",urlPatterns = "/demo/myServlet",description = "自定义的servlet")public class MyServletDemo1 extendsHttpServlet {

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, 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) throwsServletException, IOException {

System.out.println("==========myServletDemo1 POST Method==========");super.doPost(req, resp);

}

}

2、使用@ServletRegistrationBean注解

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

@Configurationpublic classServletConfiguration {/*** 代码注入*/@BeanpublicServletRegistrationBean myServletDemo() {return new ServletRegistrationBean(new MyServletDemo2(), "/demo/servletDemo2");

}

}

b、自定义的Servlet

public class MyServletDemo2 extendsHttpServlet {

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, 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) throwsServletException, 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 implementsFilter {public void init(FilterConfig filterConfig) throwsServletException {

System.out.println(">>>>>>myFilter init ……");

}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throwsIOException, ServletException {

System.out.println(">>>>>>执行过滤操作");

filterChain.doFilter(servletRequest, servletResponse);

}public voiddestroy() {

System.out.println(">>>>>>myFilter destroy ……");

}

}

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

2、通过@FilterRegistrationBean注册

a、@Bean注入自定义的Filter

@Configurationpublic classServletConfiguration {

@BeanpublicFilterRegistrationBean myFilterDemo(){

FilterRegistrationBean registration= newFilterRegistrationBean();

registration.setFilter(newMyFilter2());

registration.addUrlPatterns("/demo/myFilter2");

registration.addInitParameter("paramName", "paramValue");

registration.setName("myFilter2");

registration.setOrder(2);//指定filter的顺序

returnregistration;

}

}

b、自定义的Filter

public class MyFilter2 implementsFilter {public void init(FilterConfig filterConfig) throwsServletException {

System.out.println("======MyFilter2 init ……");

}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throwsIOException, ServletException {

System.out.println("======MyFilter2执行过滤操作");

filterChain.doFilter(servletRequest, servletResponse);

}public voiddestroy() {

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

@WebListenerpublic class MyLisener implementsServletContextListener {public voidcontextInitialized(ServletContextEvent servletContextEvent) {

System.out.println("MyLisener contextInitialized method");

}public voidcontextDestroyed(ServletContextEvent servletContextEvent) {

System.out.println("MyLisener contextDestroyed method");

}

}

2、通过@ServletListenerRegistrationBean 注册

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

@Configurationpublic classServletConfiguration {

@BeanpublicServletListenerRegistrationBean myListener(){return new ServletListenerRegistrationBean(newMyLisener());

}

}

b、自定义的Listener

public class MyLisener implementsServletContextListener {public voidcontextInitialized(ServletContextEvent servletContextEvent) {

System.out.println("MyLisener contextInitialized method");

}public voidcontextDestroyed(ServletContextEvent servletContextEvent) {

System.out.println("MyLisener contextDestroyed method");

}

}

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

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

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

@Configurationpublic classServletConfiguration {/**代码注入*/@BeanpublicServletRegistrationBean myServletDemo(){return new ServletRegistrationBean(new MyServletDemo2(),"/demo/*");

}

@BeanpublicFilterRegistrationBean myFilterDemo(){

FilterRegistrationBean registration= newFilterRegistrationBean();

registration.setFilter(newMyFilter2());

registration.addUrlPatterns("/demo/myFilter");

registration.addInitParameter("paramName", "paramValue");

registration.setName("myFilter2");

registration.setOrder(2);//指定filter的顺序

returnregistration;

}

@BeanpublicFilterRegistrationBean myFilterDemo2(){

FilterRegistrationBean registration= newFilterRegistrationBean();

registration.setFilter(newMyFilter3());

registration.addUrlPatterns("/demo/*");

registration.addInitParameter("paramName", "paramValue");

registration.setName("myFilter3");

registration.setOrder(1);returnregistration;

}

@BeanpublicServletListenerRegistrationBean myListener(){return new ServletListenerRegistrationBean(newMyLisener());

}

}

View Code

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

MyLisener contextInitialized method

======MyFilter2 init ……

======MyFilter3 init ……

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

======MyFilter3执行过滤操作

======MyFilter2执行过滤操作

>>>>>>>>>>test Get Method==========

可以看出:

Filter3比Filter2先执行;

Filter可以匹配上的url都会执行,并且按顺序执行(Filter的调用链);

Filter比servlet先执行。

servlet先按具体匹配,然后模糊匹配,并且只能有一个servlet匹配上,没有servlet调用链。

执行顺序是:Listener》Filter》Servlet

五、ApplicationListener自定义侦听器类

六、Interceptor

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

a、自定义拦截器

public class MyInterceptor implementsHandlerInterceptor {public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throwsException {

System.out.println(">>>>MyInterceptor preHandle");return true;

}public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throwsException {

System.out.println(">>>>MyInterceptor postHandle");

}public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throwsException {

System.out.println(">>>>MyInterceptor afterCompletion");

}

}

b、注册拦截器

@Configurationpublic class WebMvcConfiguration extendsWebMvcConfigurerAdapter {

@Overridepublic voidaddInterceptors(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处理了请求,此时拦截器不处理)

拦截器不处理。

java servlet filter_Java的Servlet、Filter、Interceptor、Listener相关推荐

  1. Java中Filter、Listener,拦截器的学习,listener、 filter、servlet 加载顺序及其详解

    Filter filter可认为是Servlet的一种"变种",它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链.它与Se ...

  2. Servlet、Filter、Listener、Interceptor基础

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

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

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

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

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

  5. java servlet filter_Java Servlet Filter

    做web开发的人对于Filter应该不会陌生,一直在很简单的使用,但是一直没有系统的总结一下,随着年纪的慢慢长大,喜欢总结一些事情,下面说说我对Filter的理解,官方给出的Filter的定义是在请求 ...

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

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

  7. java filter与servlet,Servlet中的Filter和Listener之间的区别(Java EE)

    There are Filters and Listeners functionality in Servlet. I want to know exact difference between Fi ...

  8. Java Web之filter、listener、Interceptor

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

  9. SpringBoot(四)-- 整合Servlet、Filter、Listener

    SpringBoot中有两种方式可以添加 Servlet.Filter.Listener. 1.代码注册 通过ServletRegistrationBean. FilterRegistrationBe ...

最新文章

  1. [译] ⚛ React 状态管理工具博物馆
  2. 去掉中文语言下 wget下载提示 英国中部时间 的问题
  3. Collect proper diagnostic data is very important
  4. [转]new Thread的弊端及Java四种线程池的使用
  5. 百度Java三面:现场面试39题目实拍含答案!
  6. 计算机是怎么RUN起来的
  7. 一起谈.NET技术,ASP.NET2.0服务器控件之类型转换器
  8. JS常用的六种设计模式详解
  9. android 应用市场图尺寸,【干货】最新App应用市场截图尺寸大全
  10. 怎么给表格加一列序号_excel表格怎么添加序号
  11. 淘集集报活动需要隐身上架商品的链接吗?
  12. JavaWeb:HTML
  13. axis监控记录服务器显示画面,AXIS VMS CMS-M 中心管理服务器
  14. nmn抗衰老有哪些品牌,nmn最新排名情况,掏心窝子推荐
  15. 移动端Vin码识别技术发展应用
  16. 怎么将pdf格式转换成jpg
  17. 【AE软件】视频添加字幕
  18. 无线通信模块定点传输-点对点的具体传输应用
  19. %@ Page% page指令属性
  20. RPG类型的游戏革命

热门文章

  1. 数据库 user schema sqlserver 关系
  2. python究竟要不要使用多线程
  3. JDBC与数据库连接工具对比分析
  4. LeetCode简单题之机器人能否返回原点
  5. 传统编译器与神经网络编译器
  6. 最大限度地减少块输出中间结果的计算和存储
  7. 视频系列:RTX实时射线追踪(下)
  8. RGB-D对红外热像仪和毫米波雷达标定
  9. 解决:Plugin ‘maven-compiler-plugin:3.1‘ not found
  10. Android进程间通信的方式