21

有时您需要在 servlet/JSP/whatever 基于HttpServletRequest. 类似http://server.name:8080/context/的东西。Servlet API 没有单一的方法来实现这一点。

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

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

4

3 回答 3

26

它被称为“基本 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.

也可以看看:

于 2013-01-10T02:07:02.647 回答
17

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

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

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

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

于 2014-11-22T00:13:44.517 回答
2

认为,

我们想从 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

于 2018-04-12T05:29:41.877 回答