基本上,我的问题是,如果用户单击一个按钮,并等待页面响应,然后单击另一个按钮,则似乎存在竞争条件。
如何避免第一个按钮的代码使用与第二个按钮的代码相同的变量?
我怀疑这两个请求都会以某种随机顺序调用相同的 getter 和 setter,因为每次单击按钮都将处于 JSF 模型的不同阶段。
下面是一个示例。假设用户单击一个按钮,操作函数会更改某个变量。该变量与 getter 和 setter 链接到精算 jsf 标签。现在假设操作函数已完成 50%。现在,用户点击相同的按钮。JSf 将调用链接到同一变量的 getter 和 setter,恢复状态或其他任何内容。基本上,该变量将重置回操作更改它之前的状态。现在,第一次点击的操作函数将继续运行,并再次更改变量。即使没有第二个操作调用,这也是一个竞争条件。
在客户端,您可能需要查看JavaScript以禁用多个提交,例如在单击后禁用提交输入类型。 不过,无论如何,这都不是一个万无一失的机制。
在 JSF 本身中,它取决于 Bean 的范围。 如果它是会话范围的,则可以同步对其操作方法(即调用应用程序方法)的访问,以便一次只有一个线程可以执行逻辑。 同样,您可以同步对共享数据的访问。 不过,这仅在您具有会话相关性时才有效。 如果你不这样做,那么你就会挣扎!
但是,组件树本身(更新值、流程验证等)仍将为第二个请求调用。 也许你可以看看一个PhaseListener或其他东西来防止这种情况,但这似乎很棘手,也许是矫枉过正。
通常,应用程序的编码和构建方式意味着您应该能够处理同一用户的多个请求。 尽管我个人选择JavaScript方法来防止多个表单提交。 您是否想更详细地解释,也许用代码片段,您认为什么问题?