request.getScheme()在Java中返回http而不是https

13
function demo(request,response){
        request.getScheme() is returning http instead of returning https.
        System.out.println(""+request.getScheme());
}

输出:http

--上面的函数演示在主方法中被调用,但它打印出了“http”,而不是在互联网服务器上工作时应该打印出“https”。


您能否使用 request.getRequestURI() 函数验证完整的 URI 是什么? - Dev
3
这似乎不是Java。 - Henry
基于方案,我正在创建一个URL以从我的应用程序访问新链接,但由于我从request.getScheme()获取的是http,所以我无法正确地生成URL路径。@Henry这是演示函数..用于提问..抱歉没有注释//返回http而不是https - Sumit
3个回答

9

如果您的服务器在代理服务器后面运行,请确保设置了代理头:

proxy_set_header X-Forwarded-Proto  $scheme;

要获取正确的scheme,您可以使用springframework的类:

HttpRequest httpRequest = new ServletServerHttpRequest(request); //request is HttpServletRequest
UriComponents uriComponents = UriComponentsBuilder.fromHttpRequest(httpRequest).build();

String scheme = uriComponents.getScheme(); // http/https

非常感谢。我在这个情况下卡了两天。 :) - Arzon Barua

6
请查看答案https://dev59.com/4mIk5IYBdhLWcg3wFKlK#19599143,注意被反向代理或负载均衡器所影响的问题。很可能这就是你的问题。
那个问题的回答者建议使用:
request.getHeader("x-forwarded-proto")

然而,这取决于您的负载均衡器正确设置标头。


3

我曾经遇到过一个类似的问题,涉及到getScheme()方法。

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

我已经解决了,使用“//”代替即可:
String basePath = "//"+request.getServerName()+":"+request.getServerPort()+path+"/";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接