在Servlet中获取HTTP和HTTPS请求的完整URL和查询字符串

我正在编写代码,该代码的任务是检索请求的URL或完整路径。我写了这段代码:

HttpServletRequest request;//obtained from other functions

String uri = request.getRequestURI();

if (request.getQueryString() != null)

uri += "?" + request.getQueryString();

因此,当我浏览时http://google.com?q=abc,确定(正确)。但是浏览时出现问题https://google.com。的价值uri就是http://google.com:443google.com:443,所以程序不只做时HTTPS使用。

和的输出相同request.getRequestURL().toString()

解决办法是什么?

回答:

根据设计,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()domainhttp(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")

如果您自己负责代理/负载平衡器的配置,则需要确保在转发时设置了这些标头。

以上是 在Servlet中获取HTTP和HTTPS请求的完整URL和查询字符串 的全部内容, 来源链接: utcz.com/qa/399296.html

回到顶部