根据设计,getRequestURL()
为您提供完整的 URL,仅缺少查询字符串。
在 HttpServletRequest
中,您可以使用以下方法获取 URI 的各个部分:
// Example: http://myhost:8080/people?lastname=Fox&age=30
String uri = request.getScheme() + "://" + // "http" + "://
request.getServerName() + // "myhost"
":" + // ":"
request.getServerPort() + // "8080"
request.getRequestURI() + // "/people"
"?" + // "?"
request.getQueryString(); // "lastname=Fox&age=30"
-
.getScheme()
如果这是一个请求,会给你。"https"
https://domain
-
.getServerName()
给出 .domain
http(s)://domain
-
.getServerPort()
会给你端口。
使用以下代码段:
String uri = request.getScheme() + "://" +
request.getServerName() +
("http".equals(request.getScheme()) && request.getServerPort() == 80 || "https".equals(request.getScheme()) && request.getServerPort() == 443 ? "" : ":" + request.getServerPort() ) +
request.getRequestURI() +
(request.getQueryString() != null ? "?" + request.getQueryString() : "");
上面的此代码段将获取完整的 URI,如果使用了默认端口,则隐藏端口,如果未提供后者,则不添加 和 查询字符串。"?"
代理请求
请注意,如果您的请求通过代理传递,则需要查看标头,因为方案可能会被更改:X-Forwarded-Proto
request.getHeader("X-Forwarded-Proto")
此外,一个常见的标头是 ,它显示原始请求 IP 而不是代理 IP。X-Forwarded-For
request.getHeader("X-Forwarded-For")
如果您自己负责代理/负载均衡器的配置,则需要确保在转发时设置这些标头。