繁体   English   中英

带过滤器的Spring MVC和RequestMapping

[英]Spring MVC and RequestMapping with filter

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

我的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;
}

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

谢谢你们

第一个问题

我的@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>

来自Spring来源:

setUseDefaultSuffixPattern

public void setUseDefaultSuffixPattern(boolean useDefaultSuffixPattern)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM