是否可以将拦截器应用于所有控制器和操作,除了一些已定义的控制器和操作?
为了清楚起见,我对在已定义的列表中应用拦截器不感兴趣。我想定义要排除的那些。
谢谢!
答案 0 :(得分:66)
从Spring 3.2开始,他们在标签
中添加了该功能mvc:exclude-mapping
请参阅Spring文档中的此示例:
<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:interceptor>
<mvc:mapping path="/secure/*"/>
<bean class="org.example.SecurityInterceptor" />
</mvc:interceptor>
以下是文档的link
答案 1 :(得分:22)
对于基于java的配置,来自docs
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleInterceptor());
registry.addInterceptor(new ThemeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
}
}
答案 2 :(得分:3)
配置拦截器时,可以指定路径模式。只有路径与拦截器路径模式匹配的控制器才会调用拦截器。
但正如您可能已经注意到的那样,路径模式不支持排除。
所以我认为唯一的方法是在拦截器内编写路径黑名单。调用拦截器时,检索HttpServletRequest.getRequestURI()
并检查路径是否列入黑名单。
您可以在拦截器的@PostConstruct
带注释的方法中构建黑名单,因此例如从属性文件中获取列入黑名单的路径。