为什么request.getRequestURL()返回非https url?

时间:2015-04-06 10:59:06

标签: jsf servlets

在我们的一个项目中,我们仍然需要使用JSF 1.2 + Tomcat 6,问题在于我发送https - 请求到服务器并尝试在托管bean中获取请求的URL,如下所示:

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest)context.getRequest();
String url = request.getRequestURL().toString()

发送请求的按钮只是一个提交按钮,如下所示:

<h:form id="contactform">
    <h:commandButton id="submit" action="#{forgotPasswordBean.doSend}"
 </h:form>

我得到http基于https的URL intead。 在Web浏览器的调试面板中,我确保实际发送了https - 请求,但URL包含仅http请求的链接。什么问题或者只是一个错误?

2 个答案:

答案 0 :(得分:10)

如果您在应用程序前面有一个负载均衡器,则会发生此行为。即使请求是在HTTPS中完成的,负载均衡器也会将它们重新发布为产生此行为的纯http请求。

一个例子是使用GAE(Google App Engine)时。您可以使用HTTPS端点(https://my-app.appspot.com),但您的应用将继续接收HTTP中的所有请求。

@ user3663882在批准的答案评论中指出了这一点。

答案 1 :(得分:2)

HttpServletRequest#getRequestUrl()包含协议,服务器名称,端口号和服务器路径,如果连接实际上是安全的并且在HTTP下,它应该包含https

但是,这不是确定连接是否安全的唯一方法。 ServelRequest接口定义了另外两个选项(ServletRequest#getScheme()ServletRequest#isSecure())来检测请求是否受到保护:

String scheme = request.getScheme(); //will return "https" when connection is secured
//or
boolean isSecured = request.isSecure(); //will return true when connection is secured

更多信息: