我在使用 url 映射时遇到问题,并认为有人可以帮助我 :-)
我的 Spring MVC 应用程序有一个 dispatcherServler 的映射如下:
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
然后我有一个控制器 servlet,其方法注释如下:
MyServlet {
....myMethod
@RequestMapping(value = "/qwert/request", method = RequestMethod.POST)
总而言之,我有一个带有映射的 DelegatingFilterProxy:
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/qwert/request</url-pattern>
</filter-mapping>
其目标是拦截所有指向上述 MyServlet 方法的请求。
该应用程序对于典型的请求localhost:port/MyApp/qwert/request运行良好,这意味着过滤器正在拦截请求并执行其业务。
问题是像这样的请求localhost:port/MyApp/qwert/request.do直接进入 Servlet (MyServlet) 方法而不通过过滤器。我的@RequestMapping 不是/qwert/request.do,请求如何最终到达servlet?
有谁知道如何在不将我的 dispatcherServlet 映射更改为 *.do 之类的东西并相应地进行其他更改的情况下解决这个问题。
我希望我的应用程序在localhost:port/MyApp/qwert/request而不是localhost:port/MyApp/qwert/request.whatever下提供请求,并且我无法将过滤器映射更改为 /* 因为还有其他不需要的方法过滤器干预。
谢谢
更新1:
是的,我尝试引入过滤器的 url 模式,例如 /qwert/request.*,但在这种情况下,过滤器不会拦截任何请求。localhost:port/MyApp/qwert/request 和 localhost:port/MyApp/qwert/request.whatever 都不是(作为普通呼叫者应该使用的第一个)
解决方案
最后我发现了问题所在,@Jhonathan 为我指出了正确的方向
我必须定义一个 RequestMappingHandlerMapping 而不是 DefaultAnnotationHandlerMapping
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping();
// no dot like names will be matched
mapping.setUseSuffixPatternMatch(false);
// no trailing slash will be matched
mapping.setUseTrailingSlashMatch(false);
return mapping;
}
这样就成功了,我现在可以在内部看到该模式不会像我在开头提到的那样处理“错误”请求。
谢谢你们