1

我在我的机器上的两个不同端口上启动了两个不同的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 和路径(但显然在不同端口上)的两个不同应用程序上使用相同浏览器进行选项卡式浏览将导致视图过期,因为浏览器会混淆两个会话。我认识到我的设置不太可能出现在生产环境中,但我想问一下:

  1. 有没有定义这种 cookie 组织行为的标准?

  2. 在多个 JSF 应用程序中进行选项卡式浏览时,是否有任何最佳实践必须注意以避免会话混淆?

  3. 是否javax.faces.STATE_SAVING_METHOD对此有任何影响(在我的设置中设置为"server")?

4

1 回答 1

3

有没有定义这种 cookie 组织行为的标准?

版本 0 cookie(Netscape规范 cookie)不以任何方式支持端口。

版本 1 cookie(RFC2965规范 cookie)支持该Port属性。如果不存在,则使用版本 0 行为。

一般的 servletcontainer 将JSESSIONIDcookie 设置为版本 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 和登录用户,则可以肯定。

于 2012-09-03T12:00:55.763 回答