当上下文根是根:“/”时,我如何使用#{request.contextPath}?

How do I use #{request.contextPath} when the context root is, well, root: "/"?

我们目前正在将 EE6/JSF 应用程序从部署路径 someserver.com/app 移动到它自己的子域 app.someserver.com

大多数事情都运行顺利,但我们在 Web 层如何处理现在基本上不存在的上下文根方面遇到了意想不到的麻烦。

我们早期发现并修复的一件事是我们设置的 cookie 的路径从 "/app" 缩短为 "",因此只能读取服务器上的每个文件夹,而不是整个文件夹申请。

我们现在发现了一个与我们在 JSF 中生成的 hyperlinks 类似的问题:

<a href="#{request.contextPath}">Go to home page</a>

这之前呈现为 href="/app" 并且工作正常,但现在 href="" 可以理解 link 不再有效。我想让它说 href=""/".

有什么优雅的解决方案吗?

请记住,我们还有 link 形式的

<a href="#{request.contextPath}/projects">Go to projects page</a>

,所以简单地用 "/" 替换空的上下文路径是不够的。

我是不是遗漏了什么明显的东西?我看到了一个解释 here(符合我们的经验),但没有详细说明可能的解决方案。

原来我没有想清楚。我非常专注于修复 #{request.contextPath} 生成的字符串,以至于我错过了我基本上一直错误地使用它。

最简单的解决方案就是使用

<a href="#{request.contextPath}/">...</a>

(带尾部斜杠)到达应用程序的根目录,切勿在没有斜杠的情况下使用 href="#{request.contextPath}"

这两种情况都解决了。如果应用程序部署到 "some_folder",则 link 变为 "some_folder/"。如果应用程序部署到服务器根目录,则 link 变为 "/".

希望这对陷入同样陷阱的人有所帮助。