我有一个扩展WebMvcConfigurationSupport
的配置类,我添加了这样的拦截器:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor()).addPathPatterns("/api/**");
}
其中myInterceptor()
是:
@Bean
public MyInterceptor myInterceptor() {
return new MyInterceptor();
}
并且它适用于我已实现的任何映射(/api/**
),例如/api/sample
- 来自MyInterceptor的preHandle被触发(我有一个带有映射/api/sample
的Controller)。
当我调用不存在的资源时,例如/api/forward/sample
永远不会调用来自MyInterceptor的preHandle。
请注意,当我在xml中使用配置时,它按预期工作,如:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/api/**" />
<bean class="my.pack.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
由于某些原因,使用java配置不会拦截不存在映射的请求。为什么配置不相同?我认为应该是。
修改
多一点调试信息。使用xml配置DispatcherServlet#handlerMappings
包含5个处理程序:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
org.springframework.web.socket.server.support.WebSocketHandlerMapping
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
org.springframework.security.oauth2.provider.endpoint.FrameworkEndpointHandlerMapping
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
使用Java配置它包含7个处理程序:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
org.springframework.web.socket.server.support.WebSocketHandlerMapping
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
org.springframework.security.oauth2.provider.endpoint.FrameworkEndpointHandlerMapping
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
问题似乎与SimpleUrlHandlerMapping
有关(至少它似乎用于我调用的资源 - api/forward/sample
,而api/sample
RequestMappingHandlerMapping
正在使用中)在基于Java的配置的情况下,它具有空的adopIterceptor。
编辑2:
示例应用程序的完整源代码(我试图让它尽可能小,只是为了演示效果): https://github.com/szprutamich/spring-demo
在课程ConfigurationBase
中 - 可以使用静态字段CONFIG
将配置从基于xml的配置切换到基于java的配置。
使用基于xml的配置,两个网址都有效:
/api/sample
/api/forward/sample
使用基于java的配置转发不起作用。
答案 0 :(得分:3)
您的问题是关于“不存在的请求映射”,但在您的XML配置中,它存在:
<default-servlet-handler xmlns="http://www.springframework.org/schema/mvc" />
这为所有请求声明了一个默认处理程序,如果找到一个有效的处理程序,请求拦截器就会起作用。删除此行,您将在XML和Java配置中获得相同的行为:将找不到默认处理程序,拦截器将无法工作。
因此,对于拦截器来处理Java配置中的所有请求,您必须声明一个默认处理程序。你可以覆盖configureDefaultServletHandling
,但是不能在它上面配置拦截器。您可能必须在默认处理控制器中明确映射/**
。