我有MVC Java配置,但HandlerInterceptor不排除某些模式。

在标有 xxx 的行上,如果

1)我将addPatterns("/**")excludePathPatterns("*.ecxld")都添加到HandlerInterceptorInterceptorRegistration中,根本不调用HandlerInterceptor.preHanlde()。例如.addPathPatterns("/**").excludePathPatterns("*.ecxld")
2)我只添加excludePathPatterns("*.ecxld")HandlerInterceptorInterceptorRegistrationHandlerInterceptor.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()
     );

 }

10-04 12:46