通过设计,可以getRequestURL()为您提供完整的URL,仅缺少查询字符串。
在中HttpServletRequest,您可以使用以下方法获取URI的各个部分:
String uri = request.getScheme() + "://" +
request.getServerName() +
":" +
request.getServerPort() +
request.getRequestURI() +
"?" +
request.getQueryString();
.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")
另外,通用标头是X-Forwarded-For,它显示原始请求IP而不是代理IP。
request.getHeader("X-Forwarded-For")
如果您自己负责代理/负载平衡器的配置,则需要确保在转发时设置了这些标头。
HttpServletRequest都错误地构造了它。也许您可以创建一个SSCCE来演示确切的问题?