10

我使用不同的服务器和配置。获取 scheme://host:[port if it is not port 80] 的最佳 Java 代码方法是什么。

这是我使用的一些代码,但不知道这是否是最好的方法。(这是伪代码)

HttpServletRequest == 请求

String serverName = request.getServerName().toLowerCase();
String scheme = request.getScheme();
int port = request.getServerPort();

String val = scheme + "://" + serverName + ":" port;

这样 val 返回:

http(s)://server.com/

或者

http(s)://server.com:7770

基本上,我需要除查询字符串和“上下文”之外的所有内容。

我还考虑使用 URL:

String absURL = request.getRequestURL();
URL url = new URL(absURL);

url.get????
4

6 回答 6

19

试试这个:

URL serverURL = new URL(request.getScheme(),      // http
                        request.getServerName(),  // host
                        request.getServerPort(),  // port
                        "");                      // file

编辑

在httphttps上隐藏默认端口:

int port = request.getServerPort();

if (request.getScheme().equals("http") && port == 80) {
    port = -1;
} else if (request.getScheme().equals("https") && port == 443) {
    port = -1;
}

URL serverURL = new URL(request.getScheme(), request.getServerName(), port, "");
于 2009-07-09T15:34:45.593 回答
2
URI u=new URI("http://www.google.com/");
String s=u.getScheme()+"://"+u.getHost()+":"+u.getPort();

正如 Cookie 所说,来自 java.net.URI ( docs )。

于 2009-07-09T15:32:28.343 回答
1
public String getServer(HttpServletRequest request) {
  int port = request.getServerPort();
  StringBuilder result = new StringBuilder();
  result.append(request.getScheme())
        .append("://")
        .append(request.getServerName());

  if (port != 80) {
    result.append(':')
          .append(port);
  }

  return result;
}
于 2009-07-09T15:35:30.320 回答
0

我认为java.net.URI 可以满足您的要求。

于 2009-07-09T15:28:40.833 回答
0

如果您想保留请求中出现的 URL(例如,如果未明确给出端口,则保留端口),您可以使用类似这样的东西。正则表达式匹配 HTTP 和 HTTPS URL。捕获组 1 包含从方案到可选端口的服务器根。(这就是您想要的。)组 2 仅包含主机名。

String regex = "(^http[s]?://([\\w\\-_]+(?:\\.[\\w\\-_]+)*)(?:\\:[\\d]+)?).*$";
Matcher urlMatcher = Pattern.compile(regex).matcher(request.getRequestURL());
String serverRoot = urlMatcher.group(1);
于 2009-07-09T15:44:07.837 回答
0

不要使用 StringBuilder 或连接 URL 的各个部分,而是使用 org.springframework.web.servlet.support.ServletUriComponentsBuilder 类来形成 URL。你可以做类似的事情

URL url = ServletUriComponentsBuilder.fromRequestUri(req).
                replacePath("/").build()
                .toUri().toURL();

请找到这篇文章,解释有效使用此类的几种方法。

于 2021-11-10T02:54:01.183 回答