【问题标题】:Why does Tomcat resolve context path differently for certain url-mappings?为什么 Tomcat 对某些 url-mappings 以不同的方式解析上下文路径?
【发布时间】:2011-05-01 20:04:18
【问题描述】:

所以,我正在尝试编写一个可以处理 url 映射的 servlet,例如:

domain/context/servlet/resource_id

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

/myServlet

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

/myServlet/*

我遇到的问题

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

域/上下文/myServlet/relative_path_I_provide

相对

域/上下文/relative_path_I_provide

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

编辑:

我的文件夹结构是这样的

WebContent
   |
   |
   |-- debug
         |
         |-- css
              |
              |-- file.css

我将它们添加到链接标签中,例如:

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

【问题讨论】:

  • 你是如何指定这些静态资源的相对路径的?
  • 这就解释了——请参阅我的回答了解为什么会发生这种情况。

标签: tomcat rest servlets url-mapping staticresource


【解决方案1】:

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

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

但是现在,通过/myServlet/* 形式的映射,servlet 在 URL 中显示为一个目录,这意味着当您转到 domain/context/myServlet/resource_id 时,相对 URL 被解析为与 resource_id 相同的目录是domain/context/servlet/

this for more

修复可能是以下之一:

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

  2. 使用具有../ 形式的路径信息的相对 URL,这将导致 URL 解析到上一级目录。如果有人决定将资源映射到 domain/context/myServlet/secondLevel/resource_id 形式的 URL,这也很脆弱并且会中断。

  3. 创建相对于应用程序上下文路径的相对 URL。您可以通过将href 值设置为request.getContextPath + "/css/files/file.css" 来做到这一点。这会将上下文路径添加到每个链接的 href 开头,因此,对于 domain/context/myServlet/resource_id 的请求,这将变为 /context/css/files/file.css 并按照您的预期解决。

【讨论】:

    【解决方案2】:

    在网址格式更改前后,您的实际网址是否发生了变化? 即你现在是在调用http://domain/context/myServlet/something 而不是http://domain/context/myServlet

    如果答案是肯定的,那么它解释了为什么静态文件现在解析为 http://domain/context/myServlet/static_file
    (出于同样的原因,所有内容都相对于早期 URL 中的上下文进行解析)

    【讨论】:

    • 是的,被调用的 url 发生了变化,但是用于加载 css 的结果链接标记中没有字符串差异。查看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 2019-08-10
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2018-11-18
    • 1970-01-01
    相关资源
    最近更新 更多