我有MVC Java配置,但HandlerInterceptor
不排除某些模式。
在标有 xxx 的行上,如果
1)我将addPatterns("/**")
和excludePathPatterns("*.ecxld")
都添加到HandlerInterceptor
的InterceptorRegistration
中,根本不调用HandlerInterceptor.preHanlde()
。例如.addPathPatterns("/**").excludePathPatterns("*.ecxld")
2)我只添加excludePathPatterns("*.ecxld")
到HandlerInterceptor
的InterceptorRegistration
,HandlerInterceptor.preHanlde()
仍然被执行。
(其他拦截器调用正常)。
任何指针表示赞赏。
谢谢
@Configuration
public class MyMVCConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(getInterceptorOne());
registry.addInterceptor(getMyHandlerInterceptor())
.excludePathPatterns("*.ecxld"); // **xxx**
registry.addInterceptor(getInterceptorTwo()
);
}
最佳答案
您为包括和排除指定的模式是 Ant 库path expressions,而不是正常的URL表达式,就像您在web.xml中表示以映射servlet或过滤器一样。
要进行排除工作,您还必须包括一个包含路径(正如您在第二句话中已经注意到的那样)。接下来,将您的排除模式更改为/**/*.ecxld
。
您当前的表达式*.ecxld
会匹配file.ecxld
,但不会匹配/file.ecxld
甚至/foo/file.ecxld
。 /**/
部分负责这一点。但是,要使其工作,还需要includePathExpression
(如果没有includePathExpression
,则代码checks会忽略excludePathExpression
,如果没有ojit_code)。
简而言之,将您的配置更改为以下内容应该可以解决您的问题。
@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()
);
}