【问题标题】:JSF application crossing user session dataJSF 应用程序跨越用户会话数据
【发布时间】:2011-06-24 10:13:58
【问题描述】:

我有一个难以解决的 JSF 问题。请注意,我对 JSF 和 Java 还很陌生....我有一个简单的应用程序,用户可以在其中登录,选择一些复选框,单击提交,在另一个页面上添加更多信息,保存到数据库并注销。

在我的生产环境中,我看到用户会话数据被交叉或缓存并被后续用户会话拾取的实例。例如,用户 A 输入数据,然后用户 B 输入数据,在查看他的数据时,他看到用户 A 输入的内容。当然,我不能在测试中重新创建它。

我正在使用 jsf 1.2._12、richfaces 3.3.2 和 spring 2.5.6。应用服务器是 JBoss 5。

我所有的 JSF 托管 bean 都是会话范围的。这个特定的托管 bean 将一个 spring bean 称为我的业务对象,它是会话范围的,最终调用一个单例的 DAO。

这里是相关的 faces-config 信息

<managed-bean>
    <description>ContactBean</description>
    <managed-bean-name>ContactBean</managed-bean-name>
    <managed-bean-class>com.package.ContactBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>

    <managed-property>
        <property-name>dataElementBO</property-name>
        <value>#{dataElementBO}</value>
    </managed-property>

    <managed-property>
        <property-name>attributeBO</property-name>
        <value>#{attributeBO}</value>
    </managed-property>

    <managed-property>
        <property-name>dataElement2BO</property-name>
        <value>#{dataElement2BO}</value>
    </managed-property>

    <managed-property>
        <property-name>submissionBO</property-name>
        <value>#{submissionBO}</value>
    </managed-property>

    <managed-property>
        <property-name>selectedList</property-name>
        <property-class>java.util.ArrayList</property-class>
        <list-entries />
    </managed-property>

    <managed-property>
        <property-name>enteredContact</property-name>
        <property-class>java.util.ArrayList</property-class>
        <list-entries />
    </managed-property>
</managed-bean>

我的 spring bean 应用上下文被调用

<bean id="submissionBO" class="com.package.submissionBOImpl" scope="session">
    <property name="submissionDAO">
        <ref bean="submissionDAO" />
    </property>
</bean>

在查看我的网络服务器日志时,当用户 A 和 B 甚至没有同时登录时会发生此问题。用户 A 注销,然后用户 B 大约 20 分钟后登录。

我不明白会话范围 bean 的使用如何可能会在其他用户数据中交叉...关于这些范围的范围我有什么不明白的地方吗?如果需要,我可以附加一些模拟代码。提前致谢!

【问题讨论】:

  • 您没有将会话范围的数据分配为某个类中的static 字段,是吗?至于本地测试,只需在同一站点上同时生成不同的浏览器,如 Firefox、Chrome、Safari 和/或 IE。
  • 我在托管 bean 或 spring bean 中使用的唯一静态变量是用于我的日志和用于在验证器方法中检查电话号码格式的 reg ex 模式。
  • 听起来很吓人。你为什么用弹簧代替接缝? Seam 比 jsf 应用程序好 100 倍。
  • 作为一个新手,教我的开发人员告诉我同样的事情......然而,“权力”说“我没有接缝”,大概是因为他们没有想在环境中引入另一种技术......所以这就是我最终的结果。

标签: spring jsf richfaces session-scope


【解决方案1】:

提交和审查页面是否使用相同的托管 bean?如果不是,您如何将数据传递到其他页面?

【讨论】:

  • 我想通了.. besc,您的评论是正确的。审查页面使用相同的托管 bean,但最终使用单例 spring bean 来获取用户审查和选择的数据(想想每行带有布尔复选框的数据表)。流程是获取数据(绑定到单例 spring BO),从该数据中选择一些行(单例和我的会话 spring BO 都得到更新),转到另一个页面,用户添加相关数据,提交并进行确认页。确认页面有一个返回按钮,可以清除所有选择。
  • 用户没有点击此按钮...他们将进入确认屏幕并注销。现在单例中的选择仍然存在,下一个用户继承它们。现在我更好地理解了这一点,我发现在我在这里看到的问题之外的许多其他级别上,使用单例获取是不好的。所以,长话短说,我将把 Spring Bean 更改为 seesion 范围(以及其他)。我认为性能不会成为问题...如果此应用在任何给定时间有超过 3 个并发会话,我会感到惊讶。
  • 这是一个很好的问题。我同意你的观点,使用会话范围,一切正常。我的想法是,如果有 100,000 个用户,这是否会导致 JVM 内存不足。另一件事是数据源连接问题。你提到DAO的事情,我假设你已经声明了与Spring的数据源连接,然后你将它绑定到DAO,当会话中有100,000个用户时,每个会话都持有一个连接。我不确定Spring如何处理这个?我急于寻找有关该领域的更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 2011-03-25
  • 2020-11-02
  • 2011-02-21
相关资源
最近更新 更多