Ric*_*ich 15 ajax jquery csrf symfony
我正在开发一个注释框,它将通过JQuery AJAX调用保存注释.
JQuery的
这是JQuery代码(这无缝地工作):
$(".post-comment").click(function() {
var $form = $(this).closest("form");
if($form)
{
$.ajax({
type: "POST",
url: Routing.generate('discussion_create'),
data: $form.serialize(),
cache: false,
success: function(html){
alert("Success!");
// Output something
}
});
}
else
{
alert("An error occured");
}
return false;
});
Run Code Online (Sandbox Code Playgroud)
Symfony2控制器
然后,Symfony2控制器方法获取表单数据并对其进行处理.作为该过程的一部分,它会检查表单是否有效:
$entry = new Discussion();
$discussionForm = $this->createForm(new DiscussionType(), $entry);
if ($request->getMethod() == 'POST') {
$discussionForm->bindRequest($request);
if ($discussionForm->isValid()) {
Run Code Online (Sandbox Code Playgroud)
此检查未返回true.在else中,我提取了已经给出的错误消息并得到:
Array
(
[0] => The CSRF token is invalid. Please try to resubmit the form
)
Run Code Online (Sandbox Code Playgroud)
CSRF令牌正在通过post传递,就像同步提交表单一样.
另一个可能的问题..独特的表格ID
我使用的表单是由表单类型类创建的.在任何给定的页面上都会有几个评论表格.由于symfony2使用类型类的getName()方法来填充表单ID属性,因此我修改了它,如下所示:
public function getName()
{
return 'discussionForm' . $randomNumber;
}
Run Code Online (Sandbox Code Playgroud)
这允许多个注释表单没有相同的id,例如discussionForm20,discussionForm21,discussionForm22等.
我可以从混合中删除symfony2 Form组件,并使用标准PHP逻辑生成表单/处理提交,但我暂时拒绝这样做.
有谁知道为什么表单CSRF令牌无效?有关如何修改或如何修改的任何建议?
Syb*_*bio 29
尝试使用适当的JQuery函数:submit()^^在我的解决方案中,我认为您的表单具有id"comment_form".适用于我所有的sf2项目:
$('#comment_form').submit(function(e) {
var url = $(this).attr("action");
$.ajax({
type: "POST",
url: url, // Or your url generator like Routing.generate('discussion_create')
data: $(this).serialize(),
dataType: "html",
success: function(msg){
alert("Success!");
}
});
return false;
});
Run Code Online (Sandbox Code Playgroud)
通常会发送CSRF字段!
并且不要忘记在表单模板中添加twig标记{{form_rest(form)}},这将生成CSRF之类的所有隐藏字段.
归档时间: |
|
查看次数: |
14867 次 |
最近记录: |