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

Ole*_*eev 19 java servlets web-applications java-ee

有时您需要在servlet/JSP /基于内容的任何内容中构建Web应用程序上下文的完整URL 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
Run Code Online (Sandbox Code Playgroud)

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

ctxUrl = req.getRequestURL();
ctxUrl = ctxUrl.substring(0, ctxUrl.lastIndexOf("/")));
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 25

它被称为"基本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()) + "/";
Run Code Online (Sandbox Code Playgroud)

ctxUrl.substring(0, ctxUrl.lastIndexOf("/")));对于包含多个文件夹的网址,您的方法会失败http://server.name:8080/context/folder1/folder2/folder3.

也可以看看:


Arc*_*ano 17

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

URI contextUrl = URI.create(req.getRequestURL().toString()).resolve(req.getContextPath());
Run Code Online (Sandbox Code Playgroud)

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

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