参见英文答案 >
Getting ViewExpiredException in clustered environment while state saving method is set to client and user session is valid 2个
我一直在尝试使用jsf中的primefaces实现一些基本的推送功能.我在那里使用了计数器示例
http://www.primefaces.org/showcase-labs/push/counter.jsf.基本上它是一个增加共享计数器的按钮.运行此示例时,我总是收到此错误:
ERROR: MAC did not verify!
我的理解是每个会话都会生成一个mac,然后检查每个传入的消息,以验证源没有改变(我认为).我一直无法找到原因并查看了其他主题,例如:
不幸的是,这些并没有解决我的问题两者似乎都是由我没有得到的ViewExpiredException引起的.我发现阻止它的唯一方法是在web.xml中将状态保存方法从客户端更改为服务器:
javax.faces.STATE_SAVING_METHOD
client
但是,当这样做时,计数器不再共享,但似乎是每个用户,这不是我想要的.我的最终目标是实现一个聊天室,其中大部分都在那里,但现在它使用的短轮询不是很容易扩展.看过primefaces推后我认为这将是理想的,但一直在努力使用它.
我尝试过多个Web服务器(Tomcat,Jetty和Glassfish),并尝试使用不同版本的JSF(Mojarra)和primefaces版本(3.4和4.0).我已在多个浏览器和多台计算机上测试过它.有时我会在收到错误之前将计数器增加几次,有时它会立即发生.我没有例外或严重的错误,一切都编译.我还想提一下,我之前在其他项目上遇到过这个错误,但是在重新启动服务器后它已经消失了.当使用primefaces时,它总会发生.任何帮助将不胜感激.
编辑
在web.xml中将状态保存保留到服务器以避免MAC错误时,我注意到共享计数器在同一台计算机上以每个浏览器为基础工作.这意味着如果我有多个选项卡或窗口,则在所有选项卡的一个更新中更新计数器.但它不能跨浏览器工作,firefox中的计数器更改不会反映在chrome或IE中,或其他方式.如果在两台独立的计算机上也没有反映出来.我不知道这是否有帮助,但我想我会提到它.
编辑
在注意到示例中的bean是会话作用域后,我将其更改为应用程序作用域.当然,会话作用域意味着每个浏览器都有自己的副本.现在,更改将反映在浏览器和计算机上.回到我原来的问题,我仍然想知道为什么将保存状态更改为服务器修复了MAC错误,这是什么意思?我假设服务器现在必须维护每个会话的视图状态而不是客户端,可伸缩性更低/客户端 – 服务器流量更多?从我所看到的,如果你将保存状态设置为服务器,你无法检查查看过期的异常或阻止用户创建视图(如果它们已经有太多,这是正确的吗?)