Java:从servlet请求中获取主机、协议和可能的端口的字符串表示

10
我处理不同的服务器和配置。获取scheme://host:[port(如果不是80端口)]的最佳java代码方法是什么?
这里是我用过的一些代码,但不知道这是否是最佳方法。(这是伪代码)
HttpServletRequest == request
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

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

我还考虑使用URL:

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

url.get????

这个链接https://dev59.com/iXNA5IYBdhLWcg3wpfiu 看起来是一个非常类似的问题。 - aem
这是一个非常通用的问题,我不能使用 Apache 库。 - Berlin Brown
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, "");

如果端口是80端口,URL字符串rep会包含:80的文本吗? - Berlin Brown

2
URI u=new URI("http://www.google.com/");
String s=u.getScheme()+"://"+u.getHost()+":"+u.getPort();

正如Cookie所说,可以从java.net.URI(文档)中找到相关信息。

我可以使用那些函数与servlet的“request”对象。 - Berlin Brown

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;
}

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);

我打了减号只是因为在这里看到了正则表达式。 - msangel
在能够检索组之前,应该先执行urlMatcher.find()。 - supercalifragilistichespirali

0

不要使用StringBuilder或将URL的部分进行串联,而是使用org.springframework.web.servlet.support.ServletUriComponentsBuilder类来形成URL。你可以这样做:

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

请查看此文章,其中解释了几种有效使用此类的方法。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接