我遇到了网址映射问题,并认为有人可能会帮助我: - )
我的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;
}
这就是诀窍,我现在可以在内部看到这种模式不像我在开头提到的那样是“错误的”请求。
谢谢大家
答案 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”后缀或以“/”结尾的路径都不会使用默认后缀模式进行转换。*