Filter

过滤器作为web.xml中重要的一部分,有着相当高的出场率,SpringBoot会默认注册几个Filter

ApplicationContextHeaderFilter

CharacterEncodingFilter

如果添加了Security依赖的话会加入SpringSecurityFilterChain

如果加入Actuator依赖的话就会加入WebRequestTraceFilter

实现自己的Filter

JavaConfig注册Bean

我们如果自己要实现自己的Filter的话,需要实现Filter并实现其中的方法

同时要利用JavaConfig的方法来配置,一般情况下需要编写@Bean注解的返回值为FilterRegistrationBean的方法来实现JavaBean的注册

具体实现如下

需要注意的是此方法需要在被@Configuration注解的配置类中

@WebFilter+@ServletComponentScan

如果觉得Java代码的方式比较繁琐的话可以采用注解方式注册Filter,具体实现方式是在Filter实现类加入@WebFilter注解

例如

然后在SpringBootApplication类上添加@ServletComponentScan

Filter的注册原理

我们采用JavaConfig的形式实现了Filter的注册,通过向上追溯得知FilterRegistrationBean的层级结构如下

ServletContextInitializer

RegistrationBean

AbstractFilterRegistrationBean

FilterRegistrationBean

经查阅SpringBoot文档发现针对ServletContextInitializer的描述如下

Interface used to configure a Servlet 3.0+ context programmatically.
Unlike WebApplicationInitializer,
classes that implement this interface (and do not implement WebApplicationInitializer)
will not be detected by SpringServletContainerInitializer and
hence will not be automatically bootstrapped by the Servlet container.

This interface is primarily designed to allow ServletContextInitializers
to be managed by Spring and not the Servlet container.

For configuration examples see WebApplicationInitializer.

既然是由SpringBoot进行管理而不是由Servlet容器管理,那么基本可以确定是由SpringBoot进行管理

在org.springframework.boot.context.embedded.tomcat包中我们找到了答案

TomcatEmbeddedServletContainerFactory的一直向上继承了AbstractConfigurableEmbeddedServletContainer

并且维护了一个私有的List<ServletContextInitializer>变量,我们不难猜出,正是因为FilterRegistrationBean继承了ServletContextInitializer而实现了Filter的注册

为了进一步验证我们的猜测,在注册Filter的JavaConfig代码中打了断点跟踪一下

可以看到在启动过程中会获取类型为ServletContextInitializer的Bean

继续向下看在SpringBoot内嵌的Tomcat中的TomcatStarter类中也同样实现了ServletContextInitializer

并且在实现方法中执行了AbstractFilterRegistrationBean实现的onStartup方法

至此Filter注册成功

Servlet和Listener

Servlet与Listener的支持与Filter大同小异,同样也是支持两种方法进行注册

JavaConfig的话不同的是Servlet需要的是ServletRegistrationBean,而Listener需要的是ServletListenerRegistrationBean

注解的话则分别是通过@WebServlet、@WebListener进行注解

至于注册管理过程则基本与Filter相同

SpringBoot消失的Web.xml的更多相关文章

  1. SpringBoot源码篇:深度分析SpringBoot如何省去web.xml

    一.前言 从本博文开始,正式开启Spring及SpringBoot源码分析之旅.这可能是一个漫长的过程,因为本人之前阅读源码都是很片面的,对Spring源码没有一个系统的认识.从本文开始我会持续更新, ...

  2. 在springBoot中配置web.xml中配置的servlet

    第一种 web.xml (截取的需要转换的) 当拦截到 /socke t时执行该servlet <servlet> <servlet-name>websocket</se ...

  3. 如何把web.xml中的context-param、Servlet、Listener和Filter定义添加到SpringBoot中

    把传统的web项目迁移到SpringBoot中,少不了web.xml中的context-param.Servlet.Filter和Listener等定义的迁移. 对于Servlet.Filter和Li ...

  4. SpringBoot源码篇:Spring5内置tomcat实现code-based的web.xml实现

    一.简介 上篇文章讲了SpingBoot诞生的历史背景和技术演进背景,并通过源码说明了SpringBoot是如何实现零配置的包括如何省去web.xml配置的原理.本文接上一篇文章,通过demo演示Sp ...

  5. 精尽Spring MVC源码分析 - 寻找遗失的 web.xml

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  6. web.xml常用标签整理(不定期更新)

    <?xml version="1.0" encoding="UTF-8"?><!-- 标明使用的XML版本和文档编码,此项必须位于第一行,之前 ...

  7. Spring-Boot快速搭建web项目详细总结

    最近在学习Spring Boot 相关的技术,刚接触就有种相见恨晚的感觉,因为用spring boot进行项目的搭建是在太方便了,我们往往只需要很简单的几步,便可完成一个spring MVC项目的搭建 ...

  8. 使用idea+springboot+Mybatis搭建web项目

    使用idea+springboot+Mybatis搭建web项目 springboot的优势之一就是快速搭建项目,省去了自己导入jar包和配置xml的时间,使用非常方便. 1.创建项目project, ...

  9. spring boot 1.x完整学习指南(含各种常见问题servlet、web.xml、maven打包,spring mvc差别及解决方法)

    spring boot 入门 关于版本的选择,spring boot 2.0开始依赖于 Spring Framework 5.1.0,而spring 5.x和之前的版本差距比较大,而且应该来说还没有广 ...

随机推荐

  1. RSA不对称加密和公钥 私钥

    理论上只要有加密的规则 基本都是可以解密的 但是如果解密需要消耗的时间过长 比如1000年 解密过后已经没什么意义了 此时可认为这种算法不能被破解 也就是说此加密可信 MD5 是一种单向操作 加密后不 ...

  2. nuxt 初接触

    对于nuxt服务端渲染让人动心的是不会再想vue一样去定义无数的路由了这一点是挺爽的!!! 先直接晒张图 在api这块增加了一个fetch方法   它会在组件每次加载前被调用(即在服务端或切换至目标路 ...

  3. Salt Master报错:Minion did not return. [No response]

    在salt master端执行salt ‘*’ test.ping时,某一节点出现如下报错:Minion did not return. [No response] 登陆到这一节点查看minion的日 ...

  4. C06 变量和存储类型

    目录 全局变量 局部变量 存储类型 全局变量和局部变量 变量的作用域 作用域:某些事物起作用或有效的区域. 变量的使用范围称为变量的作用域. 变量的作用域决定了变量的可操作性和有效性. C语言变量的作 ...

  5. Perl 使用哈希的引用

    $ref = \%hash_clomnname_linevalue; $hash_of_whole_table{$table_name} = {%$ref};

  6. OpenCV2.4.11+VS2012的环境配置+“fatal error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突”的问题解决

    本来OpenCV环境配置的问题是个基础问题,但是步骤有点小烦,所以几乎每次都要百度一下,加上这次遇到的“fatal error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突 ...

  7. GIMP图像窗口的自定义

    具体功能包含:初始缩放比例.空格键按下时触发动作

  8. Linux–varnish(一)

    简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高.速度更快.管 ...

  9. A Fast and Easy to Use AES Library

    http://www.codeproject.com/Articles/57478/A-Fast-and-Easy-to-Use-AES-Library Introduction EfAesLib i ...

  10. 多线程并发情况下 重复insert问题

    代码逻辑: if(数据不存在){ insert(); } 线程启动后,发现数据库表中有相同的记录 解决方案 synchronized同步代码块即加同步锁,synchronized同步代码块的功能: 当 ...