servlet 过滤器属于servlet api,和spring关系不大。除了使用过滤器包装web请求,spring mvc还提供handlerinterceptor(拦截器)工具。根据文档,handlerinterceptor的功能跟过滤器类似,但拦截器提供更精细的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。
添加拦截器不仅是在webconfiguration中定义bean,spring boot提供了基础类webmvcconfigureradapter,我们项目中的webconfiguration类需要继承这个类。
继承webmvcconfigureradapter;
为localechangeinterceptor添加@bean定义,这仅仅是定义了一个interceptor spring bean,但是spring boot不会自动将它加入到调用链中。
拦截器需要手动加入调用链。
修改后完整的webconfiguration代码如下:
使用<code>mvn spring-boot:run</code>运行程序,然后通过httpie访问<code>http://localhost:8080/books?locale=foo</code>,在终端看到如下错误信息。
ps:这里发生错误并不是因为我们输入的locale是错误的,而是因为默认的locale修改策略不允许来自浏览器的请求修改。发生这样的错误说明我们之前定义的拦截器起作用了。
在我们的示例项目中,覆盖并重写了addinterceptors(interceptorregistory registory)方法,这是典型的回调函数——利用该函数的参数registry来添加自定义的拦截器。
在spring boot的自动配置阶段,spring boot会扫描所有webmvcconfigurer的实例,并顺序调用其中的回调函数,这表示:如果我们想对配置信息做逻辑上的隔离,可以在spring boot项目中定义多个webmvcconfigurer的实例。