获取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