Spring Boot项目中定制拦截器的方法详解
这篇文章主要介绍了SpringBoot项目中定制拦截器的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Servlet过滤器属于ServletAPI,和Spring关系不大。除了使用过滤器包装web请求,SpringMVC还提供HandlerInterceptor(拦截器)工具。根据文档,HandlerInterceptor的功能跟过滤器类似,但拦截器提供更精细的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。
SpringMVC中常用的拦截器有:LocaleChangeInterceptor(用于国际化配置)和ThemeChangeInterceptor。我们也可以增加自己定义的拦截器,可以参考这篇文章中提供的demo
实战
添加拦截器不仅是在WebConfiguration中定义bean,SpringBoot提供了基础类WebMvcConfigurerAdapter,我们项目中的WebConfiguration类需要继承这个类。
继承WebMvcConfigurerAdapter;
为LocaleChangeInterceptor添加@Bean定义,这仅仅是定义了一个interceptorspringbean,但是Springboot不会自动将它加入到调用链中。
拦截器需要手动加入调用链。
修改后完整的WebConfiguration代码如下:
packagecom.test.bookpub; importorg.apache.catalina.filters.RemoteIpFilter; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.web.servlet.config.annotation.InterceptorRegistry; importorg.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; importorg.springframework.web.servlet.i18n.LocaleChangeInterceptor; @Configuration publicclassWebConfigurationextendsWebMvcConfigurerAdapter{ @BeanpublicRemoteIpFilterremoteIpFilter(){ returnnewRemoteIpFilter(); } @BeanpublicLocaleChangeInterceptorlocaleChangeInterceptor(){ returnnewLocaleChangeInterceptor(); } @OverridepublicvoidaddInterceptors(InterceptorRegistryregistry{ registry.addInterceptor(localeChangeInterceptor()); } }
使用mvnspring-boot:run运行程序,然后通过httpie访问http://localhost:8080/books?locale=foo,在终端看到如下错误信息。
Servlet.service()forservlet[dispatcherServlet]incontextwithpath[] threwexception[Requestprocessingfailed;nestedexceptionis java.lang.UnsupportedOperationException:CannotchangeHTTPaccept header-useadifferentlocaleresolutionstrategy]withrootcause
PS:这里发生错误并不是因为我们输入的locale是错误的,而是因为默认的locale修改策略不允许来自浏览器的请求修改。发生这样的错误说明我们之前定义的拦截器起作用了。
分析
在我们的示例项目中,覆盖并重写了addInterceptors(InterceptorRegistoryregistory)方法,这是典型的回调函数——利用该函数的参数registry来添加自定义的拦截器。
在SpringBoot的自动配置阶段,SpringBoot会扫描所有WebMvcConfigurer的实例,并顺序调用其中的回调函数,这表示:如果我们想对配置信息做逻辑上的隔离,可以在SpringBoot项目中定义多个WebMvcConfigurer的实例。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。