【发布时间】:2017-05-11 01:27:33
【问题描述】:
是否可以将拦截器应用于所有控制器和操作,除了一些已定义的控制器和操作?
为了清楚起见,我对在已定义的列表上应用拦截器不感兴趣。我想定义那些要排除的。
谢谢!
【问题讨论】:
是否可以将拦截器应用于所有控制器和操作,除了一些已定义的控制器和操作?
为了清楚起见,我对在已定义的列表上应用拦截器不感兴趣。我想定义那些要排除的。
谢谢!
【问题讨论】:
从 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
【讨论】:
对于基于 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/*");
}
}
【讨论】:
... <bean class="org.example.SecurityInterceptor"/> ... - 只是为了让其他人知道 SecurityInterceptor 不是 springframework 类。
配置拦截器时,可以指定路径模式。只有路径与拦截器路径模式匹配的控制器才会调用拦截器。
但您可能已经注意到,路径模式不支持排除。
所以我认为唯一的方法是在拦截器内编写一个路径黑名单。调用拦截器时,检索HttpServletRequest.getRequestURI() 并检查路径是否被列入黑名单。
您可以在拦截器的 @PostConstruct 注释方法中构建黑名单,例如从属性文件中获取黑名单路径。
【讨论】:
@RequestMapping注解。所以对拦截器有同样的东西意味着基本上用@RequestMapping注释一个拦截器。但这目前是不可能的。