Skip to content

拦截器

您可以注册拦截器以应用于传入的请求,如下例所示:

java
@Configuration
public class WebConfiguration implements WebMvcConfigurer {

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

	override fun addInterceptors(registry: InterceptorRegistry) {
		registry.addInterceptor(LocaleChangeInterceptor())
		registry.addInterceptor(UserRoleAuthorizationInterceptor()).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.handler.UserRoleAuthorizationInterceptor">
			<property name="authorizedRoles" value="ROLE_USER"/>
		</bean>
	</mvc:interceptor>
</mvc:interceptors>

警告

由于可能与注解控制器的路径匹配存在不一致,拦截器并不理想地适合作为安全层。通常,我们建议使用 Spring Security,或者采用集成到 Servlet 过滤器链中的类似方法,并尽可能早地应用。

提示

XML 配置将拦截器声明为 MappedInterceptor bean,而这些 bean 又被任何 HandlerMapping bean 探测到,包括来自其他框架的 bean。相比之下,Java 配置仅将拦截器传递给它管理的 HandlerMapping bean。要在 Spring MVC 和其他框架的 HandlerMapping bean 之间重用相同的拦截器,并使用 MVC Java 配置,可以声明 MappedInterceptor bean(不要在 Java 配置中手动添加它们),或者在 Java 配置和其他 HandlerMapping bean 中配置相同的拦截器。


补充教学

1. HandlerInterceptor 的核心方法

  • preHandle(...): 在控制器方法执行之前调用。如果返回 false,则中断请求处理,后续的拦截器和控制器都不会被执行。
  • postHandle(...): 在控制器方法执行之后、视图渲染之前调用。可以以此修改 ModelAndView
  • afterCompletion(...): 在整个请求完成(包括视图渲染)后调用。通常用于清理资源或处理异常。

2. 过滤器 (Filter) vs 拦截器 (Interceptor)

  • 过滤器 (Filter): 属于 Servlet 容器级别。它在 DispatcherServlet 处理之前触发,无法感知 Spring 的上下文和 Handler 信息。
  • 拦截器 (Interceptor): 属于 Spring MVC 级别。它由 HandlerMapping 触发,可以访问 Spring 管理的 Bean,并且能够获取当前正在处理请求的 Handler 实例。

Based on Spring Framework.