MVC Java Config - HandlerInterceptor不排除路径

时间:2013-11-27 12:55:53

标签: java spring-mvc spring-3

我有一个MVC Java配置,但HandlerInterceptor并没有排除某些模式。

在标有 xxx 的行,如果

1)我将addPatterns("/**")excludePathPatterns("*.ecxld")添加到HandlerInterceptor的{​​{1}},根本不会调用InterceptorRegistration。例如HandlerInterceptor.preHanlde()

2)我只向.addPathPatterns("/**").excludePathPatterns("*.ecxld")的{​​{1}}添加excludePathPatterns("*.ecxld")HandlerInterceptor仍在执行。

(其他拦截器被调用很好)。

任何指针都表示赞赏。

由于

InterceptorRegistration

5 个答案:

答案 0 :(得分:9)

您为include和exclude指定的模式是ant base path expressions,而不是正常的URL表达式,就像您在web.xml中表达以​​映射servlet或过滤器一样。

要进行排除工作,您还必须包含一个包含路径(正如您在第二次评论时已经注意到的那样)。接下来将排除模式更改为/**/*.ecxld

您当前的表达式*.ecxldfile.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,因此可能会有所不同,但是为我解决了以下问题:

  1. (我试图避免将它们定义为春豆。它没有帮助。)
  2. 我将拦截器配置为spring bean(因此我可以将内容自动装入其中see here
  3. 我改变了我的定义如下:

    registry.addInterceptor(getMyHandlerInterceptor()) .addPathPatterns(" / **&#34) .excludePathPatterns(" /用户/登录&#34);

  4. 通过在excludePathPatterns之前放置addPathPatterns,拦截器的行为突然正常工作。

答案 2 :(得分:1)

调试后,拦截器不会按照添加顺序执行。在上面的例子中,interceptorOne,然后是interceptorTwo,然后执行处理程序(带有排除模式)。

答案 3 :(得分:0)

我遇到了这个麻烦,无法排除路径。 我调试后,发现是因为Spring安全重定向到“/ login”,因为“/ login”包含在“/ **”中,那为什么无法访问。

解决方案是添加登录&注销链接也是排除路径!

答案 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/**");
}

我希望这会有所帮助。