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

2022-08-31 12:28:26

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

HttpServletRequest request;//obtained from other functions
String uri = request.getRequestURI();
if (request.getQueryString() != null)
    uri += "?" + request.getQueryString();

所以,当我浏览它是可以的(正确)。但是当我浏览时有问题。的值是 ,所以程序不只在使用时。http://google.com?q=abchttps://google.comurihttp://google.com:443google.com:443HTTPS

输出与 相同。request.getRequestURL().toString()

解决方案是什么?


答案 1

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

此外,一个常见的标头是 ,它显示原始请求 IP 而不是代理 IP。X-Forwarded-For

request.getHeader("X-Forwarded-For")

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


答案 2

简单使用:

String Uri = request.getRequestURL()+"?"+request.getQueryString();

推荐