我对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下服务请求。无论如何,我都无法将筛选器映射更改为/*因为还有其他方法不需要筛选器干预。
谢谢
更新1:
是的,我试图引入过滤器的url模式,比如/qwert/request.*但是在这种情况下,过滤器不会拦截任何请求。localhost:port/myapp/qwert/request和localhost:port/myapp/qwert/request.whatever都不是(普通调用方应该使用的第一个)
解决方案
“最后我发现了问题所在,”乔纳坦指了指我正确的方向。
我必须定义一个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;
}
这就是诀窍所在,现在我可以从内部看到,模式不会像我在开始提到的那样处理“错误”请求。
谢谢大家
最佳答案
第一个问题
我的@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源:
setUseDefaultSuffix模式
public void setUseDefaultSubfixPattern(布尔useDefaultSubfixPattern)
设置是否也使用默认后缀模式注册路径:即“/users”是否也应注册为“/users.”和“/users/”。
默认值为“true”。如果要严格解释@requestmapping路径,请关闭此约定。
请注意,包含“.xxx”后缀或以“/”结尾的路径在任何情况下都不会使用默认后缀模式进行转换。*