3

我在使用 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;
}

这样就成功了,我现在可以在内部看到该模式不会像我在开头提到的那样处理“错误”请求。

谢谢你们

4

1 回答 1

1

第一个问题

我的@RequestMapping 不是/qwert/request.do,请求如何最终到达servlet?

Spring 默认取

/qwert/request.do 
/qwert/request.whatever
/qwert/request.*

喜欢

/qwert/request 

因此,您的@RequestMapping(value = "/qwert/request", method = RequestMethod.POST)要求。更改您的 DefaultAnnotationHandlerMapping 以更改此默认选项:

 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
     <property name="useDefaultSuffixPattern" value="false" />
 </bean>

来自春天源:

setUseDefaultSuffixPattern

公共无效 setUseDefaultSuffixPattern(布尔值 useDefaultSuffixPattern)

设置是否使用默认后缀模式注册路径:即“/users”是否应该注册为“/users. ”和“/users/”。默认为“真”。如果您打算严格解释 @RequestMapping 路径,请关闭此约定。请注意,包含“.xxx”后缀或以“/”结尾的路径在任何情况下都不会使用默认后缀模式进行转换。*

于 2012-10-03T13:32:48.627 回答