获取 Web 应用上下文的 URL(基本 URL)

有时,您需要在基于 的 servlet/JSP/任何内容中构造一个完整的 WEB 应用程序上下文 URL。比如 http://server.name:8080/context/。Servlet API 没有单一的方法来实现这一点。HttpServletRequest

简单的方法是将所有 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("/")));

上述两种方法是否总是产生相同的结果?


答案 1

它被称为“基本URL”(您可以在HTML标记中使用的URL)。您可以按如下方式获取它:<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

另请参阅:


答案 2

以下内容将获取上下文 URL 并相应地解决问题。

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

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

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


推荐