我在机器上的两个不同端口上启动了两个不同的JBoss AS 7.1实例,并向它们部署了相同的应用程序(具有相同的根上下文)。当我使用同一浏览器(Chrome、Firefox或Conkeror)进行选项卡浏览时,这种配置无疑给了我以下例外:
javax.servlet.ServletException: viewId:/whatever.xhtml - View /whatever.xhtml could not be restored.
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
当我用不同的浏览器浏览时,一切都很好。
在对不同浏览器如何存储cookie进行进一步调查后,我发现组合(IP/路径)必须是唯一的,以避免此类选项卡式浏览问题,并且端口不会发挥作用。即cookie是按照IP和路径存储的,但不是按照端口。因此,在部署在同一IP和路径上(但显然在不同的端口上)的两个不同应用程序上使用同一浏览器进行选项卡式浏览会导致视图过期,因为浏览器会混淆这两个会话。我认识到我的设置不太可能出现在生产环境中,但我想问:
有什么标准可以定义这种cookie组织行为吗?
在多个JSF应用程序中进行选项卡式浏览时,为了避免会话混淆,有什么最佳实践需要注意吗?
javax.faces.STATE_SAVING_METHOD
与此有关吗(在我的设置中,它被设置为"server"
)?
有什么标准可以定义这种cookie组织行为吗
0版cookie(Netscape规范cookie)不以任何方式支持端口。
版本1 cookie(RFC2965规范cookie)支持Port
属性。如果没有,则使用版本0行为。
平均servlet容器将JSESSIONID
cookie设置为版本0 cookie。理论上,您可以通过在servlet容器中提供自定义的"会话管理器"来覆盖它。请注意,MSIE 9仍然不支持版本1 cookie。
在多个JSF应用程序中进行选项卡浏览时,为了避免会话混淆,有什么最佳实践必须注意吗
现实世界项目中的规范方法是使用不同的子域(在同一端口上!)。例如beta.example.com
、dev.example.com
、update.example.com
、test.example.com
等
javax.faces.STATE_SAVING_METHOD
与此有关吗(在我的设置中,它被设置为"server"
)
如果您将其设置为client
,那么ViewExpiredException
确实会消失,因为视图不再存储在会话中,而是存储在表单的隐藏字段中。但是,如果您在会话中存储一些内容,例如会话范围内的托管bean和登录用户,您可能仍会面临其他与会话相关的问题。