这是场景。
我的 Java Web 应用程序具有以下路径
https://www.mywebsite.com:9443/MyWebApp
假设有一个 JSP 文件
https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp
我需要找回
https://www.mywebsite.com:9443/MyWebApp
在这个 JSP 文件中。
当然,有一种相当懒惰和愚蠢的方式来获取 URL,然后重新跟踪路径。
但是有没有一种程序化的方式来做到这一点?具体来说,我认为我可以获得域+端口,但我如何实际检索应用程序名称“MyWebApp”?
查看 HttpServletRequest
的文档。
为了在您的示例中构建 URL,您需要使用:
获取方案()
获取服务器名称()
获取服务器端口()
获取上下文路径()
这是一个将返回您的示例的方法:
public static String getURLWithContextPath(HttpServletRequest request) {
return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
Web 应用程序名称(实际上是上下文路径)可通过调用 HttpServletrequest#getContextPath()
获得(因此不是之前建议的 getServletPath()
)。您可以通过 ${pageContext.request.contextPath}
在 JSP 中检索它。
<p>The context path is: ${pageContext.request.contextPath}.</p>
如果您打算将它用于 JSP 页面中的所有相对路径(这会使这个问题更有意义),那么您可以使用 HTML <base>
标记:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="url">${req.requestURL}</c:set>
<c:set var="uri" value="${req.requestURI}" />
<!doctype html>
<html lang="en">
<head>
<title>SO question 2204870</title>
<base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/">
<script src="js/global.js"></script>
<link rel="stylesheet" href="css/global.css">
</head>
<body>
<ul>
<li><a href="home.jsp">Home</a></li>
<li><a href="faq.jsp">FAQ</a></li>
<li><a href="contact.jsp">Contact</a></li>
</ul>
</body>
</html>
然后页面中的所有链接将自动与 <base>
相关,因此您无需在任何地方复制粘贴上下文路径。请注意,当相对链接以 /
开头时,它们将不再与 <base>
相关,而是与域根相关。
ServletContext.getContextPath()
返回的上下文路径应被视为应用程序的主要或首选上下文路径”。这就是我在意识到这件事后将这个包含在我原来的答案中的原因。我没有删除我的第一次尝试,因为我希望 OP 考虑通读文档并了解更多有关相关方法的信息。我希望你明白我的意思。
getServletPath()
返回 /filename.jsp
。 OP根本没有要求,这当然不是要走的路。
<base>
标记?不应该关闭所有标签吗?
应用程序名称来自 getContextPath
。
我发现 Agile Software Craftsmanship HttpServletRequest Path Decoding 中的这张图整理了所有可用的不同方法:
https://i.stack.imgur.com/btajG.png
以下代码可能对使用 JavaScript 的 Web 应用程序有用。
var newURL = window.location.protocol + "//" + window.location.host + "" + window.location.pathname;
newURL = newURL.substring(0,newURL.indexOf(""));
如果您将 url 作为字符串传递并想要提取该应用程序的上下文根,则可以使用此正则表达式来提取它。它适用于以上下文根开头的完整 url 或相对 url。
url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
request.getLocalAddr()
getContextPath()
不返回任何内容!getServerPort()
只返回 2 位数字,而不是 4 位数字!我可以提供一些帮助吗?