获取URL到webapp上下文(基本URL)

有时您需要在servlet / JSP /基于HttpServletRequest任何内容中构建Web应用程序上下文的完整URL。 像http://server.name:8080/context/这样的东西。 Servlet API没有一种方法可以实现这一点。

直接的方法是将所有URL组件附加到StringBuffer ,如

 ctxUrl = sb.append(req.getScheme()).append("://") .append(req.getgetServerName()).append(":") .append(req.getServerPort()) etc 

我想知道这个替代方案是否有任何问题(速度提高了10倍):

 ctxUrl = req.getRequestURL(); ctxUrl = ctxUrl.substring(0, ctxUrl.lastIndexOf("/"))); 

以上两种方法总会产生相同的结果吗?

它被称为“基本URL”(您可以在HTML 标签中使用的那个)。 您可以按如下方式获得它:

 StringBuffer url = req.getRequestURL(); String uri = req.getRequestURI(); String ctx = req.getContextPath(); String base = url.substring(0, url.length() - uri.length() + ctx.length()) + "/"; 

你的ctxUrl.substring(0, ctxUrl.lastIndexOf("/"))); 对于具有多个文件夹的URL,例如http://server.name:8080/context/folder1/folder2/folder3方法将失败。

也可以看看:

  • 如何在不包含上下文根名称的情况下使用相对路径? (对于JSP答案)
  • 如何获得基本URL? (对于JSF答案)

以下将获取上下文URL并适当地解决问题。

 URI contextUrl = URI.create(req.getRequestURL().toString()).resolve(req.getContextPath()); 

这将对端口,斜杠和什么不进行所有必要的处理。 它也适用于根上下文,因为req.getContextPath()将返回""

如果您使用代理服务器,则需要确保传入原始Host:请求(例如Apache ProxyPass指令到ProxyPreserveHost

假设,

我们希望从Java Web应用程序项目的任何位置获取http://server.name:8080/context/

 String uri = request.getRequestURI(); //uri = "/context/someAction" String url = request.getRequestURL().toString(); // url = "http://server.name:8080/context/someAction" String ctxPath = request.getContextPath(); // ctxPath = "/context"; url = url.replaceFirst(uri, ""); // url = "http://server.name:8080" url = url + ctxPath; //url = "http://server.name:8080/context" 

使用此代码块,我们可以获取URL