拦截器

在Java配置中,您可以注册拦截器以应用于传入请求,如下例所示:

  • Java

  • Kotlin

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new LocaleChangeInterceptor());
		registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
	}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {

	override fun addInterceptors(registry: InterceptorRegistry) {
		registry.addInterceptor(LocaleChangeInterceptor())
		registry.addInterceptor(ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**")
	}
}

以下示例展示了如何在XML中实现相同的配置:

<mvc:interceptors>
	<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
	<mvc:interceptor>
		<mvc:mapping path="/**"/>
		<mvc:exclude-mapping path="/admin/**"/>
		<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>
拦截器不太适合作为安全层,因为可能会与注释控制器路径匹配不上,这也可能匹配尾部斜杠和路径扩展,以及其他路径匹配选项。许多这些选项已被弃用,但仍存在匹配不上的可能性。通常,我们建议使用Spring Security,其中包括一个专用的MvcRequestMatcher来与Spring MVC路径匹配对齐,并且还有一个安全防火墙,可以阻止URL路径中的许多不需要的字符。
XML配置将拦截器声明为MappedInterceptor bean,然后这些拦截器会被任何HandlerMapping bean检测到,包括其他框架的bean。相比之下,Java配置只将拦截器传递给它管理的HandlerMapping bean。要在Spring MVC和其他框架的HandlerMapping bean之间重用相同的拦截器,可以声明MappedInterceptor bean(并且不要在Java配置中手动添加它们),或者在Java配置和其他HandlerMapping bean中配置相同的拦截器。