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

pro*_*mer 73 java servlets httprequest

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

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

所以,当我浏览http://google.com?q=abc它是可以的(正确的).但是当我浏览时有问题https://google.com.的价值urihttp://google.com:443google.com:443,这样的程序时,不仅不HTTPS被使用.

并且输出相同request.getRequestURL().toString().

解决办法是什么?

acd*_*ior 157

通过设计,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"
Run Code Online (Sandbox Code Playgroud)
  • .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() : "");
Run Code Online (Sandbox Code Playgroud)

上面的代码片段将获取完整的URI,如果使用默认端口则隐藏端口,如果"?"未提供后者,则不添加查询字符串.


代理请求

请注意,如果您的请求通过代理,您需要查看X-Forwarded-Proto标头,因为该方案可能会被更改:

request.getHeader("X-Forwarded-Proto")
Run Code Online (Sandbox Code Playgroud)

此外,公共标头是X-Forwarded-For显示原始请求IP而不是代理IP.

request.getHeader("X-Forwarded-For")
Run Code Online (Sandbox Code Playgroud)

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


sum*_*oje 10

使用方法:

String Uri = request.getRequestURL()+"?"+request.getQueryString();
Run Code Online (Sandbox Code Playgroud)