java - JSF "Error Mac did not verify!"

标签 java jsf primefaces

<分区>

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

ERROR: MAC did not verify!

我的理解是,每个 session 都会生成一个 mac,然后检查每条传入消息以验证源是否未更改(我认为)。我无法找到造成这种情况的原因,并查看了其他线程,例如:

ERROR: MAC did not verify! PrimeFaces

JSF: Mojarra 2.1 to 2.2 migration causing ViewExpiredException

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

<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>

然而,当这样做时,计数器不再共享,而是显示为每个用户,这不是我想要的。我的最终目标是实现一个聊天室,它大部分都在那里,但现在它使用的是可扩展性不是很好的短轮询。在查看了 primefaces push 之后,我认为它是理想的,但一直在努力使用它。

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

编辑

当将状态保存到 web.xml 中的服务器以避免 MAC 错误时,我注意到共享计数器在同一台机器上以每个浏览器为基础工作。这意味着如果我有多个选项卡或窗口,则在所有选项卡或窗口中一次更新计数器。但它不适用于浏览器,firefox 中计数器的变化不会反射(reflect)在 chrome 或 IE 中,反之亦然。如果在两台独立的计算机上,它也不会反射(reflect)出来。我不知道这是否有帮助,但我想我会提到它。

编辑

在注意到示例中的 bean 是 session 作用域后,我将其更改为应用程序作用域。当然, session 范围意味着每个浏览器都有自己的副本。现在,这些更改会反射(reflect)在浏览器和机器上。回到我原来的问题,我仍然想知道为什么将保存状态更改为服务器可以修复 MAC 错误,这意味着什么?我假设服务器现在必须为每个 session 而不是客户端维护 View 状态,可扩展性较差/客户端-服务器流量较多?根据我的阅读,如果您将保存状态设置为服务器,您将无法检查 View 过期异常或阻止用户创建 View (如果他们已经有太多 View ),这是正确的吗?

最佳答案

你的应用似乎有依赖问题 ViewExpiredException 可以轻松处理,没问题 handle ViewExpiredException

完整配置的 JSF 项目示例 JSF2.2 frontend

关于java - JSF "Error Mac did not verify!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22701554/

相关文章:

jsf - SelectOneMenu 中的 PrimeFaces 和可见自动完成

jsf - JSF 是否有多列数据表?

java - 二叉树遍历不起作用

java - Java中的未知编译器错误,我认为这是一个范围问题

java - 将 ContentValues 转换为 JSON 字符串的最佳(最简单)方法是什么?

javascript - 在 JavaScript if 语句中调用 Bean 函数来评估 Primefaces 对象

jsf-2 - 禁用 primefaces 日历中的日期选择器

java - Tango 图像格式 YCRCB_420_SP

java - JSF 页面的最大大小

jquery - 将 Primefaces 与外部 JQuery 库集成