小编Shi*_*fty的帖子

JSF"错误Mac没有验证!"

我一直在尝试使用jsf中的primefaces实现一些基本的推送功能.我在那里使用了反例http://www.primefaces.org/showcase-labs/push/counter.jsf.基本上它是一个增加共享计数器的按钮.运行此示例时,我总是收到此错误:

ERROR: MAC did not verify!
Run Code Online (Sandbox Code Playgroud)

我的理解是每个会话都会生成一个mac,然后检查每个传入的消息,以验证源没有改变(我认为).我一直无法找到原因并查看了其他主题,例如:

错误:MAC没有验证!PrimeFaces

JSF:Mojarra 2.1到2.2迁移导致ViewExpiredException

不幸的是,这些并没有解决我的问题 两者似乎都是由我没有得到的ViewExpiredException引起的.我发现阻止它的唯一方法是在web.xml中将状态保存方法从客户端更改为服务器:

<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
Run Code Online (Sandbox Code Playgroud)

但是,当这样做时,计数器不再共享,但似乎是每个用户,这不是我想要的.我的最终目标是实现一个聊天室,其中大部分都在那里,但现在它使用的短轮询不是很容易扩展.看过primefaces推后我认为这将是理想的,但一直在努力使用它.

我尝试过多个Web服务器(Tomcat,Jetty和Glassfish),并尝试使用不同版本的JSF(Mojarra)和primefaces版本(3.4和4.0).我已在多个浏览器和多台计算机上测试过它.有时我会在收到错误之前将计数器增加几次,有时它会立即发生.我没有例外或严重的错误,一切都编译.我还想提一下,我之前在其他项目上遇到过这个错误,但是在重新启动服务器后它已经消失了.当使用primefaces时,它总会发生.任何帮助将不胜感激.

编辑

在web.xml中将状态保存保留到服务器以避免MAC错误时,我注意到共享计数器在同一台计算机上以每个浏览器为基础工作.这意味着如果我有多个选项卡或窗口,则在所有选项卡的一个更新中更新计数器.但它不能跨浏览器工作,firefox中的计数器更改不会反映在chrome或IE中,或其他方式.如果在两台独立的计算机上也没有反映出来.我不知道这是否有帮助,但我想我会提到它.

编辑

在注意到示例中的bean是会话作用域后,我将其更改为应用程序作用域.当然,会话作用域意味着每个浏览器都有自己的副本.现在,更改将反映在浏览器和计算机上.回到我原来的问题,我仍然想知道为什么将保存状态更改为服务器修复了MAC错误,这是什么意思?我假设服务器现在必须维护每个会话的视图状态而不是客户端,可伸缩性更低/客户端 - 服务器流量更多?从我所看到的,如果你将保存状态设置为服务器,你无法检查查看过期的异常或阻止用户创建视图(如果它们已经有太多,这是正确的吗?)

java jsf primefaces

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×1

jsf ×1

primefaces ×1