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

这是场景。

我的Java Web应用程序有以下path

https://www.mywebsite.com:9443/MyWebApp 

假设有一个JSP文件

 https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp 

我需要检索

 https://www.mywebsite.com:9443/MyWebApp 

在这个JSP文件中。

当然,获取URL然后重新追溯path的方式是相当懒散和愚蠢的。

但是有没有一个程序化的方式来做到这一点? 具体来说,我想我可以得到域名+端口,但是我怎样才能真正检索应用程序名称“MyWebApp”?

通过调用HttpServletrequest#getContextPath() (因此不像以前build议的那样,不包含getServletPath() ,Web应用程序名称(实际上是上下文path)可用。 您可以通过${pageContext.request.contextPath}在JSP中检索。

 <p>The context path is: ${pageContext.request.contextPath}.</p> 

如果你打算在JSP页面中使用这个相对path(这将使这个问题更有意义),那么你可以使用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> ,这样就不需要在任何地方复制上下文path。 请注意,当相对链接以/开始时,它们将不再相对于<base> ,而是与域根相关。

看看HttpServletRequest的文档。
为了在你的例子中build立url,你将需要使用:

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

这是一个将返回你的例子的方法:

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

我强烈build议你阅读文档 ,类似的方法。 如果你对上下文path感兴趣,可以看看这里, ServletContext.getContextPath() 。

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

 var newURL = window.location.protocol + "//" + window.location.host + "" + window.location.pathname; newURL = newURL.substring(0,newURL.indexOf("")); 

如果你传递一个url作为一个string,并且想要提取该应用程序的上下文根,你可以使用这个正则expression式来提取它。 它将适用于以上下文根开头的完整url或相关url。

 url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")