带过滤器的Spring MVC和RequestMapping

时间:2012-10-03 13:19:57

标签: java spring-mvc url-mapping

我遇到了网址映射问题,并认为有人可能会帮助我: - )

我的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)方法,而不通过Filter。我的@RequestMapping不是/qwert/request.do,请求如何最终到达servlet?

有没有人知道如何在不将我的dispatcherServlet映射更改为* .do之类的情况下解决这个问题,并相应地进行其他更改。

我希望我的应用程序在 localhost:port / MyApp / qwert / request 下提供请求,而不是 localhost:port / MyApp / qwert / request.whatever 和我无法将过滤器映射更改为/ *,因为还有其他方法不需要过滤器干预。

由于

更新1:

是的,我尝试引入过滤器的url-pattern,如/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;
}

这就是诀窍,我现在可以在内部看到这种模式不像我在开头提到的那样是“错误的”请求。

谢谢大家

1 个答案:

答案 0 :(得分:1)

第一个问题

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

默认弹簧

/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>

来自Spring Source:

setUseDefaultSuffixPattern

public void setUseDefaultSuffixPattern(boolean useDefaultSuffixPattern)

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