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

时间:2013-01-10 02:02:41

标签: java java-ee web-applications servlets

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

直接的方法是将所有网址组件附加到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("/")));

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

3 个答案:

答案 0 :(得分:24)

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

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("/")));等多个文件夹的网址,您的http://server.name:8080/context/folder1/folder2/folder3方法会失败。

另见:

答案 1 :(得分:16)

以下内容将获取上下文URL并正确解决问题。

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

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

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

答案 2 :(得分:1)

假设,

我们希望从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