2

我有一个表格。当我更改该表单内的 Select-Element 时,我对相同的 URL 执行 Ajax-Call,它基本上加载了一个新表单,该表单具有一些额外的字段或删除了一些字段(不同的类别,不同的字段......)。

现在,我从请求中获得的表单显然将具有相同的 Csrf 令牌,因为令牌存在于一个请求中。意思是,每当我执行此类操作时,我都必须生成一个新令牌,但我真的不知道如何执行此操作。

我的假设是我必须做类似的事情

if ($request->isXmlHttpRequest()) {
    $form->get('csrf')    ->regenerateCsrfToken()
}

但显然该功能不存在,但它应该类似于那些行。任何输入将不胜感激

4

2 回答 2

4

你有没有试过这个:

if ($request->isXmlHttpRequest()) {
    $form->get('csrf')->getCsrfValidator()->getHash(true);
}

getHash(true)将重新生成哈希,并将更改的哈希存储在生成器中,因此您的表单将在稍后从元素中检索新值时检索它。

于 2013-08-16T11:46:42.223 回答
1

@MichaelGooden 的答案是绝对正确的。这是解决问题的一般方法。但是,在我所做的事情中,内部还有另一个错误,这也可能与其他用户有关。我的select.onChange()方法是:

  • 保存表单数据
  • 获取新表单(GET /item/add/categoryId)
  • 重新填充相同的表单域

这样做,我也意外地保存了 CSRF 令牌并将存储的令牌重新填充为新令牌。显然那是行不通的。所以在我的form.rePopulate(data)函数中,我只是简单地排除了 CSRF 元素,就是这样,所有的工作都像一个魅力。

于 2013-08-16T11:52:20.733 回答