如何只从HttpServletRequest获取部分URL?

时间:2012-12-28 05:59:05

标签: java string url servlets httprequest

从以下网址我需要单独(http://localhost:9090/dts) 那就是我需要删除(documents/savedoc)(OR)
   只需获得 - (http://localhost:9090/dts)

http://localhost:9090/dts/documents/savedoc  

请求中是否有任何方法可以获得上述内容?

我尝试了以下内容并获得了结果。但仍在努力。

System.out.println("URL****************"+request.getRequestURL().toString());  
System.out.println("URI****************"+request.getRequestURI().toString());
System.out.println("ContextPath****************"+request.getContextPath().toString());

URL****************http://localhost:9090/dts/documents/savedoc  
URI****************/dts/documents/savedoc  
ContextPath****************/dts

有人可以帮我解决这个问题吗?

6 个答案:

答案 0 :(得分:34)

你说你想完全得到:

http://localhost:9090/dts

在您的情况下,上述字符串包括:
1)scheme http
2)服务器host name localhost
3)服务器port 9090
4)context path dts

(有关请求路径元素的更多信息,请参阅官方Oracle Java EE Tutorial Getting Information from Requests

第一个变种:

String scheme = request.getScheme();
String serverName = request.getServerName();
int serverPort = request.getServerPort();
String contextPath = request.getContextPath();  // includes leading forward slash

String resultPath = scheme + "://" + serverName + ":" + serverPort + contextPath;
System.out.println("Result path: " + resultPath);


第二种变体:

String scheme = request.getScheme();
String host = request.getHeader("Host");        // includes server name and server port
String contextPath = request.getContextPath();  // includes leading forward slash

String resultPath = scheme + "://" + host + contextPath;
System.out.println("Result path: " + resultPath);

两种变体都会为您提供所需内容:http://localhost:9090/dts

当然还有其他变种,就像其他已经写过的......

您在询问如何获取http://localhost:9090/dts的原始问题时,即您希望获得包含计划的路径。

如果您仍然不需要计划,快速方法是:

String resultPath = request.getHeader("Host") + request.getContextPath();

你会得到(在你的情况下):localhost:9090/dts

答案 1 :(得分:12)

AFAIK对此没有API提供的方法,需要定制。

String serverName = request.getServerName();
int portNumber = request.getServerPort();
String contextPath = request.getContextPath();

//试试这个

System.out.println(serverName + ":" +portNumber + contextPath );

答案 2 :(得分:12)

只需从URL中删除URI,然后将上下文路径附加到它。当您处理默认端口80时,不需要摆弄松散的方案和端口,这些方法和端口根本不需要出现在URL中。

StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();
String ctx = request.getContextPath();
String base = url.substring(0, url.length() - uri.length() + ctx.length());
// ...

另见:

答案 3 :(得分:1)

根据我的理解,您只需要域部分和上下文路径。基于这种理解,您可以使用此方法获取所需的字符串。

String domain = request.getRequestURL().toString();
String cpath = request.getContextPath().toString();

String tString = domain.subString(0, domain.indexOf(cpath));

tString = tString + cpath;

答案 4 :(得分:0)

对于那些想要在他们的端点中获得以端点为目标的首页的网址的人。你可以用这个:

request.getHeader("referer")

答案 5 :(得分:-1)

通常,我有这样一种方法:

public String getAbsoluteContextPath() throws MalformedURLException {
    ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
    HttpServletRequest request = (HttpServletRequest) context.getRequest();
    URL url = new URL(request.getRequestURL().toString());
    return url.getProtocol() + "://" + url.getAuthority() + context.getRequestContextPath();
}

仅当当前请求中存在端口号时,此方法才会返回所需的端口号。对于您的情况,它将返回:http:// localhost:9090 / dts