java – 在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://域请求。
> .getServerName()为http(s)://域提供域。
> .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而不是proxys IP。
request.getHeader(“X-Forwarded-For”)

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

转载注明原文:java – 在Servlet中获取HTTP和HTTPS请求的完整URL和查询字符串 - 代码日志