按照设计,getRequestURL()
可以返回完整的URL,只是没有查询字符串。
在HttpServletRequest
中,您可以使用以下方法获取URI的各个部分:
String uri = request.getScheme() + "://" +
request.getServerName() +
":" +
request.getServerPort() +
request.getRequestURI() +
"?" +
request.getQueryString();
.getScheme()
将在https://domain
请求时返回"https"
。
.getServerName()
在http(s)://domain
上返回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来演示确切的问题?请注意,我的任务仅限于翻译,不包括其他解释或内容。 - parsifal