在我们的一个项目中,我们仍然需要使用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
请求的链接。什么问题或者只是一个错误?
答案 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
更多信息: