Spring Boot项目中如何定制servlet-filters
本文首发于个人网站:Spring Boot项目中如何定制servlet-filters
在实际的web应用程序中,经常需要在请求(request)外面增加包装用于:记录调用日志、排除有XSS威胁的字符、执行权限验证等等。除了上述提到的之外,Spring Boot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,并且我们在自己的项目中还可以增加别的过滤器。
Spring Boot、Spring Web和Spring MVC等其他框架,都提供了很多servlet 过滤器可使用,我们需要在配置文件中定义这些过滤器为bean对象。现在假设我们的应用程序运行在一台负载均衡代理服务器后方,因此需要将代理服务器发来的请求包含的IP地址转换成真正的用户IP。Tomcat 8 提供了对应的过滤器:RemoteIpFilter。通过将RemoteFilter这个过滤器加入过滤器调用链即可使用它。
实战
一般在写简单的例子时,不需要单独定义配置文件,只需要将对应的bean对象定义在Application类中即可。正式的项目中一般会有单独的web配置文件,我们在项目的com.test.bookpub
(与BookpubApplication.java同级)下建立WebConfiguration.java文件,并用@Configuration注解修饰。
package com.test.bookpub;
import org.apache.catalina.filters.RemoteIpFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebApplication {
@Bean
public RemoteIpFilter remoteIpFilter() {
return new RemoteIpFilter();
}
}
通过mvn spring-boot:run
启动项目,可以在终端中看到如下的输出信息,证明RemoteIPFilter已经添加成功。
分析
项目的主类——BookPubApplication,可以看到由@SpringBootApplication注解修饰,这包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。在Spring Boot的自动配置、Command-line Runner一文中曾对这个三个注解做详细解释,@ComponentScan让Spring Boot扫描到WebConfiguration类并把它加入到程序上下文中,因此,我们在WebApplication中定义的Bean就跟在BookPubApplication中定义一样。
方法public RemoteIpFilter remoteIpFilter() { ... }
返回一个RemoteIPFilter类的spring bean。当Spring Boot监测到有javax.servlet.Filter的bean时就会自动加入过滤器调用链。从上图中还可以看到,该Spring Boot项目一次加入了这几个过滤器:characterEncodingFilter(用于处理编码问题)、hiddenHttpMethodFilter(隐藏HTTP函数)、httpPutFormContentFilter、requestContextFilter(请求上下文),以及我们刚才自定义的RemoteIPFilter。
所有过滤器的调用顺序跟添加的顺序相反,过滤器的实现是责任链模式,具体的原理分析可以参考:责任链模式
Spring Boot 1.x系列
- Spring Boot的自动配置、Command-line-Runner
- 了解Spring Boot的自动配置
- Spring Boot的@PropertySource注解在整合Redis中的使用
- Spring Boot项目中如何定制HTTP消息转换器
- Spring Boot整合Mongodb提供Restful接口
- Spring中bean的scope
- Spring Boot项目中使用事件派发器模式
- Spring Boot提供RESTful接口时的错误处理实践
- Spring Boot实战之定制自己的starter
- Spring Boot项目如何同时支持HTTP和HTTPS协议
- 自定义的Spring Boot starter如何设置自动配置注解
- Spring Boot项目中使用Mockito
- 在Spring Boot项目中使用Spock测试框架
- Spring Boot项目中如何定制拦截器
- Spring Boot项目中如何定制PropertyEditors
- Spring Boot构建的Web项目如何在服务端校验表单输入
- Spring Boot应用的健康监控
本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。
Spring Boot项目中如何定制servlet-filters的更多相关文章
- Spring Boot项目中如何定制拦截器
本文首发于个人网站:Spring Boot项目中如何定制拦截器 Servlet 过滤器属于Servlet API,和Spring关系不大.除了使用过滤器包装web请求,Spring MVC还提供Han ...
- Spring Boot项目中如何定制PropertyEditors
本文首发于个人网站:Spring Boot项目中如何定制PropertyEditors 在Spring Boot: 定制HTTP消息转换器一文中我们学习了如何配置消息转换器用于HTTP请求和响应数据, ...
- Spring Boot项目中如何定制HTTP消息转换器
在构建RESTful数据服务过程中,我们定义了controller.repositories,并用一些注解修饰它们,但是到现在为止我们还没执行过对象的转换--将java实体对象转换成HTTP的数据输出 ...
- Spring Boot项目中使用Mockito
本文首发于个人网站:Spring Boot项目中使用Mockito Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试:生成测试数据初始化数据库用于测试 ...
- 在Spring Boot项目中使用Spock测试框架
本文首发于个人网站:在Spring Boot项目中使用Spock测试框架 Spock框架是基于Groovy语言的测试框架,Groovy与Java具备良好的互操作性,因此可以在Spring Boot项目 ...
- 在Spring Boot项目中使用Spock框架
转载:https://www.jianshu.com/p/f1e354d382cd Spock框架是基于Groovy语言的测试框架,Groovy与Java具备良好的互操作性,因此可以在Spring B ...
- 你真的理解 Spring Boot 项目中的 parent 吗?
前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent> <groupId ...
- Spring Boot项目中使用Swagger2
Swagger2是一款restful接口文档在线生成和在线接口调试工具,Swagger2在Swagger1.x版本的基础上做了些改进,下面是在一个Spring Boot项目中引入Swagger2的简要 ...
- Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent
前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent> <groupId ...
随机推荐
- Golang 接口与反射知识要点
目录 Golang 接口与反射知识要点 1. 接口类型变量 2. 类型断言 3. 鸭子类型 4. 反射机制 5. reflect 包 TypeOf().ValueOf() Type().Kind() ...
- MongoDB的全文索引
Table of Contents 背景 如何使用 准备工作:插入数据 建立全局索引 查询结果 使用中存在哪些问题? 英文存在停止词 中文无法采用全文索引 前面了解了多种索引方式,比如单键索引,多 ...
- Python列表的深度排序
实例1:>>>L = [2,3,1,4]>>>L.sort()>>>L>>>[1,2,3,4] 实例2:>>> ...
- 在 Vue-cli 创建的项目中引入 Element-UI
Element-UI 是饿了么前端团队退出了一套基于 vue.js 开发的 UI 组件库,在与 Vue-cli 创建的项目结合时,需要做以下配置: 1. 安装 loader 模块 cnpm insta ...
- JS的加减乘除高精度
//除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精确的除法结果. //调用:accDiv(arg1,arg2) ...
- Vue/React圆环进度条
数据展示,一直是各行各业乐此不疲的需求,具体到前端开发行业,则是各种各种图表数据展示,各种表格数据展示,烦不胜烦(繁不胜繁)! 前几天刚做了折线图.柱状图.饼状图之类的图表数据展示效果,今天又碰到了类 ...
- mac下ip地址重定向
在终端临时使用最高权限用vim编辑/etc下的hosts文件,若提示Password: 输入开机登录密码并回车: yanguobindeMacBook-Pro:~ yanguobin$ sudo vi ...
- 同步与互斥_percpu变量
percpu变量的关键就是:要求根据CPU的个数,在内存中生成多份拷贝,并且能够根据变量名和CPU编号,正确的对各个CPU的变量进行寻址. 采用per-cpu变量有下列好处:所需数据很可能存在于处理器 ...
- Color Length UVALive - 5841
题文:见网页:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=sho ...
- python属性的默认值
python类的构造函数中属性可以设置默认值,实例化出来的对象如果属性使用默认值,默认值的地址是相同的. class A: def __init__(self, name = []): self.__ ...