gpt4 book ai didi

java - 使用 java 配置的不存在请求映射的拦截器

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:05 26 4
gpt4 key购买 nike

我有一个配置类,它扩展了 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/示例 RequestMappingHandlerMapping 正在使用中)在基于 Java 的配置的情况下具有空的 adoptedIterceptors。

编辑 2:

示例应用程序的完整源代码(为了演示效果,我尽量把它弄小了): https://github.com/szprutamich/spring-demo

ConfigurationBase 类中 - 配置可以从基于 xml 的静态字段 CONFIG 切换到基于 java 的配置。

使用基于 xml 的配置,两个 url 都可以工作:

/api/sample
/api/forward/sample

使用基于 java 的配置 forward 不起作用。

最佳答案

您的问题是关于“不存在的请求映射”,但在您的 XML 配置中,它存在:

<default-servlet-handler xmlns="http://www.springframework.org/schema/mvc" />
这声明了所有请求的默认处理程序,如果找到有效的处理程序,请求拦截器就会工作。删除此行,您将在 XML 和 Java 配置中获得相同的行为:将找不到默认处理程序并且拦截器将不起作用。

因此,为了让拦截器处理您的 Java 配置中的所有请求,您必须声明一个默认处理程序。你可以覆盖 configureDefaultServletHandling但据我所知,不可能在其上配置拦截器。您可能必须显式映射 /**在默认处理 Controller 中。

关于java - 使用 java 配置的不存在请求映射的拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43297318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com