我有一个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 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() ); }