Java JSF-不同机器上浏览器共享的会话范围bean
我们有一个搜索表单,其中过滤器绑定到托管bean(会话范围)上的属性。它不是组件绑定,它的属性绑定类似于Java JSF-不同机器上浏览器共享的会话范围bean,java,session,jsf,Java,Session,Jsf,我们有一个搜索表单,其中过滤器绑定到托管bean(会话范围)上的属性。它不是组件绑定,它的属性绑定类似于 从不同的机器(不同的会话)提交的数据越来越复杂。你搜索“约翰”,得到“玛丽”,只是因为你旁边的人刚刚搜索了“玛丽”。你的searchBean.filter的值是获取他提交的数据,而不是你的数据 我已经在谷歌上搜索了很多次,并没有找到解决方案,只是出现了一些问题 有人已经面对过这个问题了吗?有什么线索吗 谢谢 这可能有两个原因: bean实际上在应用程序范围内 所讨论的属性声明为静态 要修复1
从不同的机器(不同的会话)提交的数据越来越复杂。你搜索“约翰”,得到“玛丽”,只是因为你旁边的人刚刚搜索了“玛丽”。你的searchBean.filter
的值是获取他提交的数据,而不是你的数据
我已经在谷歌上搜索了很多次,并没有找到解决方案,只是出现了一些问题
有人已经面对过这个问题了吗?有什么线索吗
谢谢 这可能有两个原因:
要修复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
,或servletFilter
,等等)。谢谢你的回答,Balus!不幸的是,两者都没有发生。我刚刚确保bean在会话范围内,并且属性不是静态的。它实际上是两台物理上不同的机器吗?你到底是怎么测试的?触发同一浏览器的两个实例不会使用不同的会话。最好的测试是分别启动两个不同浏览器的一个实例(例如一个IE和一个FF)。您可以通过页面中的${pageContext.Session.ID}
调试会话ID。听起来不可思议,它们是两台物理上不同的机器,在不同的表上,由不同的人操作。会话ID如何?其他会话范围的属性如何?监听器/验证器/转换器如何?它们不保存一些静态/实例特定的数据,是吗?通过调试和跟踪PhaseListener
,我可以意识到会话范围的bean在新用户进来后停止与JSF生命周期交互。尽管正确的值贯穿整个生命周期,但它会忽略输入,并且在调用应用程序后也不会将输出传递回JSF。问题是我仍然没有关于原因的线索。我还按照你上面的建议检查了侦听器/验证器/转换器,但不幸的是事实并非如此。很高兴你解决了这个问题。线程安全问题总是归结为作用域问题(即,应用程序或会话的作用域不正确,或者只是声明为静态)。有趣的是,与其他人的代码发生冲突。也许你对一些简历不太在意?无论如何,如果问题得到了回答,请不要忘记设置接受的答案。