我有一个MVC Java配置,但HandlerInterceptor
并没有排除某些模式。
在标有 xxx 的行,如果
1)我将addPatterns("/**")
和excludePathPatterns("*.ecxld")
添加到HandlerInterceptor
的{{1}},根本不会调用InterceptorRegistration
。例如HandlerInterceptor.preHanlde()
2)我只向.addPathPatterns("/**").excludePathPatterns("*.ecxld")
的{{1}}添加excludePathPatterns("*.ecxld")
,HandlerInterceptor
仍在执行。
(其他拦截器被调用很好)。
任何指针都表示赞赏。
由于
InterceptorRegistration
答案 0 :(得分:9)
您为include和exclude指定的模式是ant base path expressions,而不是正常的URL表达式,就像您在web.xml中表达以映射servlet或过滤器一样。
要进行排除工作,您还必须包含一个包含路径(正如您在第二次评论时已经注意到的那样)。接下来将排除模式更改为/**/*.ecxld
。
您当前的表达式*.ecxld
与file.ecxld
匹配,但与/file.ecxld
甚至/foo/file.ecxld
不匹配。 /**/
部分负责处理。但是要使其工作,还需要includePathExpression
(代码checks如果有includePathExpression
,则忽略excludePathExpression
。
因此,简而言之,将您的配置更改为以下内容可以解决您的问题。
@Configuration
public class MyMVCConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(getInterceptorOne());
registry.addInterceptor(getMyHandlerInterceptor())
.includePathPatterns("/**")
.excludePathPatterns("/**/*.ecxld");
registry.addInterceptor(getInterceptorTwo()
);
}
答案 1 :(得分:2)
我知道这是很久以前但我偶然发现了同样的问题。在我搜索过程中,我找到了以下blog。在那里提到如果拦截器被配置为bean,它们将自动添加到链中。 我现在正在使用Spring 4.1.x,因此可能会有所不同,但是为我解决了以下问题:
我改变了我的定义如下:
registry.addInterceptor(getMyHandlerInterceptor()) .addPathPatterns(" / **&#34) .excludePathPatterns(" /用户/登录&#34);
通过在excludePathPatterns之前放置addPathPatterns,拦截器的行为突然正常工作。
答案 2 :(得分:1)
调试后,拦截器不会按照添加顺序执行。在上面的例子中,interceptorOne,然后是interceptorTwo,然后执行处理程序(带有排除模式)。
答案 3 :(得分:0)
解决方案是添加登录&注销链接也是排除路径!
答案 4 :(得分:0)
我在使用SpringBoot时遇到了类似的问题。
我是如何解决这个问题的?
我做了一个方法来返回一个新的Interceptor实例。并且您必须在注册表的addPathPattern方法之后编写excludePathPatters。
以下是代码段:
@Bean
public AuthInterceptor getAuthInterceptor() {
return new AuthInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(**getAuthInterceptor()**)
.addPathPatterns("/**")
.excludePathPatterns("/login/**");
}
我希望这会有所帮助。