为了账号安全,请及时绑定邮箱和手机立即绑定

Spring MVC Servlet 映射,“/xxx”和“/xxx/*”之间的区别

Spring MVC Servlet 映射,“/xxx”和“/xxx/*”之间的区别

喵喵时光机 2023-09-20 16:04:51
我对 Spring MVC 的 url 模式映射的工作原理感到困惑。当'getServletMappings'返回“/”时,我可以通过“ http://localhost:8080/hello ”得到正确的响应。但如果我将其更改为“/app”并将 url 更改为“ http://localhost:8080/app/hello ”,则不起作用,它会返回 404 错误。我是否误解了什么,我还发现“/app/*”可以工作(我可以理解这一点),但为什么不能“/app”?请检查我的代码:public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {    @Override    protected String[] getServletMappings() {        // works with http://localhost:8080/hello        return new String[] {                "/"        };        // NOT working with http://localhost:8080/app/hello        // return new String[] {        //      "/app"        //};    }}@RestControllerpublic class HTTPMethodsController {   @RequestMapping("/hello")   public String hello() {       return "Hello SpringMVC.";   }}
查看完整描述

1 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

根据Servlet规范第12.2章,Servlet的映射必须使用以下语法:

  • 以“/”字符开头并以“/*”后缀结尾的字符串用于路径映射。

  • 以“*”开头的字符串。前缀用作扩展映射。

  • 空字符串(“”)是一种特殊的URL模式,它精确映射到应用程序的上下文根,即表单应用程序上下文根的请求,即表单http://host:port //的请求。在本例中,路径信息为“/”,servlet 路径和上下文路径为空字符串 (“”)。

  • 仅包含“/”字符的字符串表示应用程序的“默认”servlet。在这种情况下,Servlet 路径是请求 URI 减去上下文路径,并且路径信息为空。

  • 所有其他字符串仅用于精确匹配。

DispatcherServlet因此,使用 URL进行映射"/app",会导致 servlet 容器仅在完全匹配时才将请求路由到它,这意味着仅当您将 url 更改为“ http://localhost:8080/app ”时。这就没有空间添加额外的路径来定位特定的 Spring 控制器(更准确地说:hello()如果您映射它,您实际上可以命中您的控制器方法@RequestMapping("/app"),因为DispatcherServlet回退到使用整个 url 进行搜索,但实际上这不是您想要的)。

因此映射“/app/*”是正确的,或者您也可以将其映射为带有“/”的默认 servlet,如您所注意到的。


查看完整回答
反对 回复 2023-09-20
  • 1 回答
  • 0 关注
  • 56 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信