如何获取域名URL和应用程序名称?


98

这是场景。

我的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”?

Answers:


91

Web应用程序名称(实际上是上下文路径)可以通过调用获得HttpServletrequest#getContextPath()(因此不能getServletPath()像以前建议的那样使用)。您可以通过在JSP中通过检索${pageContext.request.contextPath}

<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>,而是相对于域根。


Doc指出:“返回的上下文路径ServletContext.getContextPath() 应被视为应用程序的主要或首选上下文路径”。这就是我在意识到这一点之后将其包含在原始答案中的原因。我没有删除我的第一次尝试,因为我希望OP考虑阅读文档并对相关方法有所了解。我希望你明白我的意思。
Adeel Ansari'2

@Vinegar:对于JSP文件,getServletPath()返回/filename.jsp。OP根本没有要求,这当然不是要走的路。
BalusC'2

我当然会在我的帖子中进行更正,但是这次我期待对我的评论做出回应,这是完全不同的:)。
Adeel Ansari'2

2
在XHTML DOCTYPE中,您需要在contextPath后面附加一个'/'字符。<base href =“ $ {pageContext.request.contextPath} /”>
Basil Musa 2012年

您为什么不关闭<base>标签?是否应该关闭所有标签?
Fabiano Francesconi 2014年

106

查看有关的文档HttpServletRequest
为了在示例中构建URL,您将需要使用:

  • getScheme()
  • getServerName()
  • getServerPort()
  • getContextPath()

这是一个将返回您的示例的方法:

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}

1
如果服务器名是localhost,如何获取IP?
Mahmoud Saleh 2012年

请注意,getScheme()并不总是适用于https,某些服务器的行为很奇怪,并且可能总是返回http而不是https。我以为我应该让你知道。如果需要,请尝试request.getRequestURL()。toString()并进行按摩
K''13年

1
@MahmoudSalehrequest.getLocalAddr()
蓝色的

如果您还显示每种方法的示例输出,那将是很好的。要启动Web服务器并运行它只是检查每个服务器的输出是一件很痛苦的事情。
2013年

1
getContextPath()在该方法中不返回任何内容!并且getServerPort()仅返回2位数字,而不返回4位数字!我可以帮忙吗?
萨姆

22

应用程序名称来自 getContextPath

我从Agile Software Craftsmanship HttpServletRequest Path Decoding中找到此图形, 整理出了所有可用的不同方法:

在此处输入图片说明


1
该图形对于回答许多问题很有用。我试图在很多问题的答案中使用它,但都被删除了:有一条规则禁止重复使用相同的答案。真可惜。从理论上讲,如果您使用相同的答案,那么问题必须相同,因此您应该将问题标记为重复。但这不是现实。同一张图可以回答许多不同的问题。实施此类任意规则的想法很小。如果您发现此图形可以最好地回答问题,请使用它。
AgilePro '19


4

以下代码对于使用JavaScript的Web应用程序可能有用。

var newURL = window.location.protocol + "//"  + window.location.host + "" + window.location.pathname;

newURL = newURL.substring(0,newURL.indexOf(""));

0

如果要向您传递URL作为字符串,并且要提取该应用程序的上下文根,则可以使用此正则表达式来提取它。它适用于以上下文根开头的完整URL或相对URL。

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.