为什么Tomcat对某些url映射的上下文路径解析不同?

为什么Tomcat对某些url映射的上下文路径解析不同?,tomcat,rest,servlets,url-mapping,staticresource,Tomcat,Rest,Servlets,Url Mapping,Staticresource,因此,我正在尝试编写一个servlet,它可以处理url映射,如: 以前,当我指定url模式时,我只是在做: /myServlet 但是,对于我想要完成的,我正在做 /myServlet/* 我遇到的问题: 我一直在为我的静态文件(css/js/etc)使用相对路径(因此,只是相对于WebContent文件夹的文件位置),现在我正在使用/myServlet/*映射,所有静态文件的请求现在都由myServlet处理。因此,基本上,静态资源现在正在解决: 域/上下文/myServlet/相对路径 相

因此,我正在尝试编写一个servlet,它可以处理url映射,如:

以前,当我指定url模式时,我只是在做:

/myServlet

但是,对于我想要完成的,我正在做

/myServlet/*

我遇到的问题

我一直在为我的静态文件(css/js/etc)使用相对路径(因此,只是相对于WebContent文件夹的文件位置),现在我正在使用
/myServlet/*
映射,所有静态文件的请求现在都由myServlet处理。因此,基本上,静态资源现在正在解决:

域/上下文/myServlet/相对路径

相对于

域/上下文/相对路径

我确信我可以通过为资源构建绝对路径而不是依赖相对路径来解决这个问题;但我只是想知道,为什么当我使用
/myServlet/*
url模式而不是
/myServlet
时,静态资源的解析路径会发生变化

编辑:

我的文件夹结构如下

WebContent
   |
   |
   |-- debug
         |
         |-- css
              |
              |-- file.css
我将它们添加到一个链接标记中,如:

<link href="debug/css/file.css" rel="stylesheet" type="text/css">

在URL模式更改前后,您的实际URL是否发生了更改? i、 e.您现在正在调用
http://domain/context/myServlet/something
而不是
http://domain/context/myServlet


如果答案是肯定的,那么它解释了为什么静态文件现在解析为
http://domain/context/myServlet/static_file

(原因与前面URL中的上下文相关的所有内容都在解析的原因相同)

好的,这就解释了。您使用的是没有路径信息的相对URL,这意味着浏览器将其解析为与包含这些URL的资源相同的目录。当您的servlet映射到
/myServlet
时,它在路径中没有显示为“目录”,即它是引用的最终资源

因此,servlet的URL的形式是
domain/context/myServlet
,因此这些相对URL也将解析为
domain/context/

但是现在,通过映射形式
/myServlet/*
,servlet在URL中显示为一个目录,这意味着当您转到
域/context/myServlet/resource\u id
时,相对URL将解析为与
资源id
相同的目录,即
域/context/servlet/

修复程序可能是以下之一:

  • 使用相对于应用程序根目录的相对URL,即以
    /
    开头的URL。但是,这将要求您在代码中为应用程序添加上下文路径,这意味着您永远不能简单地使用不同的名称部署它,而不必更改所有内容。简而言之,不要这样做

  • 使用带有路径信息的相对URL,其形式为
    。/
    ,这将导致URL解析为上一级目录。这也是脆弱的,如果有人决定将资源映射到
    domain/context/myServlet/secondLevel/resource\u id
    格式的URL,就会破坏

  • 创建相对于应用程序上下文路径的相对URL。您可以通过将
    href
    值设置为
    request.getContextPath+“/css/files/file.css”
    来实现这一点。这将把上下文路径前置到每个链接的
    href
    的开头,因此,对于
    域/context/myServlet/resource\u id
    的请求,这将成为
    /context/css/files/file.css
    ,并按照您的期望进行解析


  • 您是如何为这些静态资源指定相对路径的?这就解释了为什么会发生这种情况-请参阅我的答案。是的,正在调用的url已更改,但用于加载css的结果链接标记中没有字符串差异。请参阅我的编辑。
    <link href="debug/css/file.css" rel="stylesheet" type="text/css">