Java JSF-不同机器上浏览器共享的会话范围bean

Java JSF-不同机器上浏览器共享的会话范围bean,java,session,jsf,Java,Session,Jsf,我们有一个搜索表单,其中过滤器绑定到托管bean(会话范围)上的属性。它不是组件绑定,它的属性绑定类似于 从不同的机器(不同的会话)提交的数据越来越复杂。你搜索“约翰”,得到“玛丽”,只是因为你旁边的人刚刚搜索了“玛丽”。你的searchBean.filter的值是获取他提交的数据,而不是你的数据 我已经在谷歌上搜索了很多次,并没有找到解决方案,只是出现了一些问题 有人已经面对过这个问题了吗?有什么线索吗 谢谢 这可能有两个原因: bean实际上在应用程序范围内 所讨论的属性声明为静态 要修复1

我们有一个搜索表单,其中过滤器绑定到托管bean(会话范围)上的属性。它不是组件绑定,它的属性绑定类似于

从不同的机器(不同的会话)提交的数据越来越复杂。你搜索“约翰”,得到“玛丽”,只是因为你旁边的人刚刚搜索了“玛丽”。你的
searchBean.filter
的值是获取他提交的数据,而不是你的数据

我已经在谷歌上搜索了很多次,并没有找到解决方案,只是出现了一些问题

有人已经面对过这个问题了吗?有什么线索吗


谢谢

这可能有两个原因:

  • bean实际上在应用程序范围内
  • 所讨论的属性声明为静态
  • 要修复1),只需确保它在会话范围内。

    要修复2),只需删除非法修饰符。

    已解决最后。谢谢大家的关注

    这有点像巴卢斯第一次猜到的。这是一个隐藏在黑暗角落里的
    静态
    。我确实仔细检查了所有东西,寻找静态,但是——别问我为什么——有人创建了第二个bean(
    Foo
    ),它保存了
    SearchBean
    的静态引用

    在JSP中,有一个
    action=“#{foo.search}”
    而不是
    searchBean.search
    。类
    Foo
    有一个与
    SearchBean
    中同名的方法,该方法只执行一个
    SearchBean.search()


    我认为昨天修复这个bug的压力不允许我在JSP中看到这个陷阱。

    您使用的是Spring(或任何其他自定义EL解析器)?不是。它是纯JSF。我正在使用mojarra-1.2_13和
    javax.faces.STATE\u SAVING\u METHOD=client
    。我们被迫使用的唯一不同的东西是。您是否正在复制一个嵌入了
    jsessionid
    的URL?您是否正在注册任何自定义侦听器?您编写过任何自定义渲染器吗?没有使用
    jsessionid
    进行复制,没有渲染器。我们使用事件监听器(bean上的方法,如
    publicvoidonchange(ValueChangeEvent事件)
    )。这就是你所说的侦听器吗?我想更多的是通过全局实例跨线程泄漏状态数据(通过将成员数据添加到
    PhaseListener
    ,或servlet
    Filter
    ,等等)。谢谢你的回答,Balus!不幸的是,两者都没有发生。我刚刚确保bean在会话范围内,并且属性不是静态的。它实际上是两台物理上不同的机器吗?你到底是怎么测试的?触发同一浏览器的两个实例不会使用不同的会话。最好的测试是分别启动两个不同浏览器的一个实例(例如一个IE和一个FF)。您可以通过页面中的
    ${pageContext.Session.ID}
    调试会话ID。听起来不可思议,它们是两台物理上不同的机器,在不同的表上,由不同的人操作。会话ID如何?其他会话范围的属性如何?监听器/验证器/转换器如何?它们不保存一些静态/实例特定的数据,是吗?通过调试和跟踪
    PhaseListener
    ,我可以意识到会话范围的bean在新用户进来后停止与JSF生命周期交互。尽管正确的值贯穿整个生命周期,但它会忽略输入,并且在调用应用程序后也不会将输出传递回JSF。问题是我仍然没有关于原因的线索。我还按照你上面的建议检查了侦听器/验证器/转换器,但不幸的是事实并非如此。很高兴你解决了这个问题。线程安全问题总是归结为作用域问题(即,应用程序或会话的作用域不正确,或者只是声明为静态)。有趣的是,与其他人的代码发生冲突。也许你对一些简历不太在意?无论如何,如果问题得到了回答,请不要忘记设置接受的答案。