0

基本上,我的问题是,如果用户单击一个按钮,并等待页面响应,然后单击另一个按钮,则似乎存在竞争条件。

如何避免第一个按钮的代码使用与第二个按钮的代码相同的变量?

我怀疑这两个请求都会以某种随机顺序调用相同的 getter 和 setter,因为每个按钮单击都将处于 JSF 模型的不同阶段。

这是一个例子。假设用户点击一个按钮,动作函数改变了一些变量。该变量通过 getter 和 setter 链接到实际的 jsf 标记。现在假设动作函数完成了 50%。现在用户点击了相同的按钮。JSf 将调用链接到同一个变量的 getter 和 setter,恢复状态或其他。基本上,该变量被重置为操作更改之前的状态。现在第一次点击的动作函数继续运行,它再次改变了变量。即使没有第二个动作调用,它也是一个竞争条件。

4

1 回答 1

1

那么在客户端,您可能希望查看 JavaScript 以禁用多个提交,例如在单击后禁用提交输入类型。无论如何,这不是一个万无一失的机制。

在 JSF 本身中,它取决于 Bean 的范围。如果它是会话范围的,您可以同步对其操作方法的访问(即调用应用程序方法),因此一次只有一个线程可以执行逻辑。同样,您可以同步对共享数据的访问。但是,这仅在您具有会话亲和性时才有效。如果你不这样做,你就会挣扎!

但是,组件树本身(更新值、流程验证等)仍然会为第二个请求调用。也许您可以查看 PhaseListener 或其他东西来防止这种情况发生,但这似乎很棘手,而且可能有点矫枉过正。

通常,您的应用程序的编码和构建方式意味着您应该能够处理同一用户的多个请求。虽然我个人倾向于使用 JavaScript 方法来防止多个表单提交。你想更详细地解释一下,也许用代码片段,你发现了什么问题?

于 2011-05-04T22:25:10.757 回答