2011-02-16 63 views
1

我正在深化发展的web应用程序切换时丢失(JSF 2.0 +小面+ RichFaces的3.3.3 +的Oracle 10g + tomcat的6.0.26)会话从HTTPS到http(Tomcat的6.0.26)

在我的应用,还有就是没有固定1路,和其他固定(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> 

所以,这条道路并不安全:/面/客户/ *。 当我从https TP HTTP动,我用这个函数:

FacesContext.getCurrentInstance().getExternalContext().redirect("http://url/faces/client/page.xhtml"); 

当我部署我的应用程序,并使用这个网址:HTTP(S):// URL/MyContext /面/ ...,所有工作得很好。当我将我的应用程序移动到ROOT上下文时,所以我使用这个URL:http(s):// url/faces /,当我从https移动到http时,我的https会话丢失,然后返回到https 。我的登录页面显示,所以我需要重新输入我的登录名和密码。

为什么我的会话丢失了?有什么不对 ?

地址:当我部署我的应用程序,这是我做的(外部服务器):

  • 把我的战争文件到WebApp文件夹

  • 启动我的服务器(这将解压缩我的战成文件夹,...),然后停止

  • 删除我的战争文件

  • 我更换根文件夹与解压缩war文件

  • 内容的内容,并重新启动我的服务器再次

但是当我把我的战成web应用程序文件夹中的所有工作正常,然后启动服务器(就这样)。

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

你有什么想法吗?

+0

如果它们是在SSL会话中生成的,tomcat会将其会话cookie标记为“安全”吗?这将阻止他们能够流入非SSL请求。 – 2011-02-17 08:15:32

回答

0

这是一个古老的问题,但值得回答,因为我碰到了它,答案变得非常简单。首先,当在HTTP和HTTPS之间来回切换时,会话应该在相同的会话cookie名称上重新生成。默认情况下,在Tomcat中,会话cookie名称是JSESSIONID。

在Tomcat中,您可以非常简单地更改会话cookie的名称。我有两个webapps,一个HTTP和另一个HTTPS,用于管理工具。任何时候HTTP webapp打开,我都会在HTTPS webapp中丢失会话。我所要做的就是将sessionCookieName添加到我的HTTPS Web应用程序的情况下:

<context sessionCookieName="ANOTHERCOOKIENAME" ...

,如果你的HTTP和HTTPS之间在同一个web应用的开关这不会帮助,但你不应该无论如何都要这样做。