从https切换到http(tomcat 6.0.26)时会话丢失

时间:2011-02-16 15:30:50

标签: session ssl tomcat6

我正在开发一个网络应用程序(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文件夹,然后启动服务器(就是全部)时,一切正常。

所以,我认为这是一个背景问题。

你有什么想法吗?

1 个答案:

答案 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之间切换,这将无济于事,但您无论如何也不应该这样做。