我目前在前端表单上遇到问题,其中表单密钥被覆盖并显示不正确的表单密钥。我目前正在客户登录表单上调试此问题。
这是login.phtml上的代码的快照,我设置了代码以查看formkey的值。
<?php
$retrievedKey = $block->getBlockHtml('formkey');
echo $retrievedKey ;
// i made a breakpoint and inspected $retrievedKey, it returned a html output <input> ... </input> with a form key value of, let's name it 'keyA'.
?>
好的,所以现在我继续执行代码后,它将成功呈现页面。
现在,我要检查chrome浏览器上的表单键隐藏输入,但是,它打印出与“ KeyA ” 完全不同的表单键。让我们将此新表单密钥命名为“ KeyB ”。
现在,我尝试登录并提交表格。我检查了发送过来的请求,它确实传递了一个反映“ KeyB”的值的表单键变量。
我在“ 验证 ”功能中放置了一些断点
Magento \ Framework \ Data \ Form \ FormKey \ Validator
这是我的比较检查器。正确地,$ formKey和$ a应该匹配。但是,事实并非如此。
$formKey = $request->getParam('form_key', null); // outputs 'KeyB'
$a = $this->_formKey->getFormKey(); // outputs 'KeyA'
因此,验证失败,并且将我重定向到登录页面,却没有任何错误消息。
注意事项:
- 仅在chrome和Microsoft EDGE中会出现这种现象。
- Firefox正常运行,没有覆盖
- 每次刷新时,打印出的表单密钥似乎都在更改。$ retrievedKey不会每次都刷新
我尝试过的事情:
- 设置:升级和设置:静态内容:部署
- 清除var / cache和var / generation
- 清除浏览器缓存和隐身模式
我只是无法理解为什么要覆盖表单键?
任何有关这种情况发生的帮助或提示都将非常有用。谢谢阅读
更新-我已经进行了一些调试,我发现page-cache.js通过再次设置form键导致了问题。这是由于以下事实:正在检查我的cookie是否设置了“ form_key” cookie,如果未设置,则创建一个新的表单密钥并保存到cookie。问题是,它无法保存cookie,这就是为什么它会继续创建新的表单键的原因。
更新-我已经解决了这个问题。这是由于Cookie域问题引起的。谢谢