gpt4 book ai didi

java - 带过滤器的 Spring MVC 和 RequestMapping

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:45 25 4
gpt4 key购买 nike

我在 url 映射方面遇到问题,我想有人可以帮助我 :-)

我的 Spring MVC 应用程序有一个 dispatcherServler 的映射如下:

<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

然后我有一个 Controller 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-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 源代码:

设置使用默认后缀模式

public void setUseDefaultSuffixPattern(boolean useDefaultSuffixPattern)

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

关于java - 带过滤器的 Spring MVC 和 RequestMapping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12709384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com