我正在开发一个网络应用程序(jsf 2.0 + facelets + richfaces 3.3.3 + oracle 10g + tomcat 6.0.26)
在我的应用中,有一条路径不安全,其他路径是安全的(web.xml):
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/faces/login.jsp</form-login-page>
<form-error-page>/faces/error.jsp</form-error-page>
</form-login-config>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>Admin_Resource</web-resource-name>
<description/>
<url-pattern>/faces/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>A</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-role>
<description>Role admin</description>
<role-name>A</role-name>
</security-role>
因此,此路径不安全:/ faces / client / *。 当我从https tp http移动时,我使用此功能:
FacesContext.getCurrentInstance().getExternalContext().redirect("http://url/faces/client/page.xhtml");
当我部署我的应用程序,并使用此URL:http(s):// url / MyContext / faces / ...时,一切正常。
但是当我将我的应用程序移动到ROOT上下文时,我使用此URL:http(s):// url / faces /,当我从https移动到http,然后返回到https时,我的https会话丢失了。我的登录页面显示,所以我需要重新输入我的登录名和密码。
为什么我的会话丢失了?有什么不对吗?
添加:当我部署我的应用时,这就是我所做的(外部服务器):
将我的war文件放入webapp文件夹
启动我的服务器(将我的战争解压缩到文件夹中,...),然后停止
我删除了我的战争文件
我用解压缩的war文件的内容替换ROOT文件夹的内容
然后重新启动我的服务器
但是当我将战争放入webapp文件夹,然后启动服务器(就是全部)时,一切正常。
所以,我认为这是一个背景问题。
你有什么想法吗?
答案 0 :(得分:0)
这是一个古老的问题,但它值得回答,因为我刚刚遇到它并且答案最终变得非常简单。首先,完全可以理解,当在HTTP和HTTPS之间来回切换时,会话应该在相同的会话cookie名称上重新生成。默认情况下,在Tomcat中,会话cookie名称为JSESSIONID。
在Tomcat中,您可以非常简单地更改会话cookie的名称。我有两个webapps,一个HTTP和另一个HTTPS,用于管理工具。无论何时打开HTTP webapp,我都会在HTTPS webapp中丢失会话。我所要做的就是将sessionCookieName
添加到我的HTTPS webapp的上下文中:
<context sessionCookieName="ANOTHERCOOKIENAME" ...
如果您在同一个网络应用中在HTTP和HTTPS之间切换,这将无济于事,但您无论如何也不应该这样做。