Spring Boot项目中如何定制拦截器
本文首发于个人网站:Spring Boot项目中如何定制拦截器
Servlet 过滤器属于Servlet API,和Spring关系不大。除了使用过滤器包装web请求,Spring MVC还提供HandlerInterceptor(拦截器)工具。根据文档,HandlerInterceptor的功能跟过滤器类似,但拦截器提供更精细的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。
Spring MVC中常用的拦截器有:LocaleChangeInterceptor(用于国际化配置)和ThemeChangeInterceptor。我们也可以增加自己定义的拦截器,可以参考这篇文章中提供的demo
实战
添加拦截器不仅是在WebConfiguration中定义bean,Spring Boot提供了基础类WebMvcConfigurerAdapter,我们项目中的WebConfiguration类需要继承这个类。
- 继承WebMvcConfigurerAdapter;
- 为LocaleChangeInterceptor添加@Bean定义,这仅仅是定义了一个interceptor spring bean,但是Spring boot不会自动将它加入到调用链中。
- 拦截器需要手动加入调用链。
修改后完整的WebConfiguration代码如下:
package com.test.bookpub; import org.apache.catalina.filters.RemoteIpFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; @Configuration public class WebConfiguration extends WebMvcConfigurerAdapter { @Bean public RemoteIpFilter remoteIpFilter() { return new RemoteIpFilter(); } @Bean public LocaleChangeInterceptor localeChangeInterceptor() { return new LocaleChangeInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry { registry.addInterceptor(localeChangeInterceptor()); } }
使用
mvn spring-boot:run运行程序,然后通过httpie访问
http://localhost:8080/books?locale=foo,在终端看到如下错误信息。
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.UnsupportedOperationException: Cannot change HTTP accept header - use a different locale resolution strategy] with root cause
PS:这里发生错误并不是因为我们输入的locale是错误的,而是因为默认的locale修改策略不允许来自浏览器的请求修改。发生这样的错误说明我们之前定义的拦截器起作用了。
分析
在我们的示例项目中,覆盖并重写了addInterceptors(InterceptorRegistory registory)方法,这是典型的回调函数——利用该函数的参数registry来添加自定义的拦截器。
在Spring Boot的自动配置阶段,Spring Boot会扫描所有WebMvcConfigurer的实例,并顺序调用其中的回调函数,这表示:如果我们想对配置信息做逻辑上的隔离,可以在Spring Boot项目中定义多个WebMvcConfigurer的实例。
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测试框架
本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。
- springboot(五).如何在springboot项目中使用拦截器
- SpringBoot项目中如何定制HTTP消息转换器
- Spring Boot项目中如何定制HTTP消息转换器
- Spring Boot项目中如何定制PropertyEditors
- springboot项目如何引入本地jar
- 详解如何在Spring Boot项目使用参数校验
- idea启动springboot项目时报错,如何解决,急! 错误日志如下
- Spring Boot 2.0(七):Spring Boot 如何解决项目启动时初始化资源
- spring boot 之 如何创建spring boot项目
- 如何把springboot项目设置成Windows系统开机启动
- 导入时如何定制spring-boot依赖项的版本
- SpringBoot项目如何进行打包部署,打包干什么用的?
- 如何使用maven将spring boot项目打成jar包
- springboot如何加入拦截器
- 如何在Spring-Boot中使用拦截器?
- spring boot项目如何启动
- Idea如何导入一个SpringBoot项目
- elasticsearch?idea中如何创建springbootelasticsearch项目?
- 如何在Spring Boot项目使用参数校验
- Spring Boot基础知识(一)----如何构建spring boot的web项目