gpt4 book ai didi

tomcat - 为什么 Tomcat 会以不同方式解析某些 url 映射的上下文路径?

转载 作者:行者123 更新时间:2023-11-28 22:45:31 25 4
gpt4 key购买 nike

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

domain/context/servlet/resource_id

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

/myServlet

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

/myServlet/*

我遇到的问题:

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

domain/context/myServlet/relative_path_I_provide

相对于

domain/context/relative_path_I_provide

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

编辑:

我的文件夹结构是这样的

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

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

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

最佳答案

好的,这就解释了。您使用的是没有路径信息的相对 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 并按预期解析。

关于tomcat - 为什么 Tomcat 会以不同方式解析某些 url 映射的上下文路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5851000/

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