对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-doc.cadn.net.cn

拦截器

在Java配置中,你可以注册拦截器以应用于传入的请求,如下例所示:spring-doc.cadn.net.cn

@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中实现相同的配置:spring-doc.cadn.net.cn

<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,或者选择与 Servlet 过滤器链集成的替代方案,并尽早部署。
XML配置将拦截器声明为MappedInterceptor bean,这些拦截器会被任何HandlerMapping bean检测到(包括来自其他框架的bean)。相比之下,Java配置仅将拦截器传递给其管理的HandlerMapping bean。要在Spring MVC和其他框架的HandlerMapping bean中复用相同的拦截器(使用MVC Java配置时),可选择声明MappedInterceptor bean(不在Java配置中手动添加),或在Java配置和其他HandlerMapping bean中同时配置相同的拦截器。