23

从以下 URL 我需要(http://localhost:9090/dts)单独行动。
那就是我需要删除(documents/savedoc)(或)
只需要得到 -(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

谁能帮我解决这个问题?

4

6 回答 6

38

你说你想得到:

http://localhost:9090/dts

在您的情况下,上述字符串包括:

  1. 方案http
  2. 服务器主机名localhost
  3. 服务器端口9090
  4. 上下文路径dts

(有关请求路径元素的更多信息,请参阅官方 Oracle Java EE 教程从请求中获取信息
##第一个变体:###

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

于 2012-12-28T22:35:32.377 回答
19

AFAIK 为此没有提供 API 方法,需要自定义。

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

// 试试这个

System.out.println(serverName + ":" +portNumber + contextPath );
于 2012-12-28T06:50:46.867 回答
16

只需从 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());
// ...

也可以看看:

于 2012-12-29T12:08:45.653 回答
3

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

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

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

tString = tString + cpath;
于 2012-12-28T06:13:14.067 回答
1

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

request.getHeader("referer")
于 2021-07-01T12:48:58.467 回答
-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

于 2020-12-18T08:41:53.743 回答