Symfony2表单与CSRF通过JQuery AJAX

前端之家收集整理的这篇文章主要介绍了Symfony2表单与CSRF通过JQuery AJAX前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个评论框,通过JQuery AJAX调用来保存注释.

JQuery的

这是JQuery代码(这可以无缝地):

@H_403_6@$(".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; });

Symfony2控制器

Symfony2控制器方法然后拾取表单数据并处理它.作为该流程的一部分,它检查表单是否有效:

@H_403_6@$entry = new Discussion(); $discussionForm = $this->createForm(new DiscussionType(),$entry); if ($request->getMethod() == 'POST') { $discussionForm->bindRequest($request); if ($discussionForm->isValid()) {

此检查未返回true.在else中我提取了哪些错误消息,并得到:

@H_403_6@Array ( [0] => The CSRF token is invalid. Please try to resubmit the form )

CSRF令牌正在通过邮件传递,就像同时提交表单一样.

另一个可能的问题..唯一的表单ID

我使用的形式是由表单类型类创建的.在任何给定的页面上都会有几个注释表单.由于symfony2使用类型类的getName()方法来填充表单ID属性,所以我修改了它:

@H_403_6@public function getName() { return 'discussionForm' . $randomNumber; }

这允许不具有相同id的多个注释表单.讨论框20,讨论框21,讨论框22等

我可以从混合中删除symfony2表单组件,并使用标准PHP逻辑生成表单/处理提交,但现在我反对.

有谁知道为什么表单CSRF令牌无效?任何关于如何修改或如何修改的建议?

解决方法

尝试使用足够的JQuery函数:submit()^^在我的解决方案中,我想你的表单有id“comment_form”.在我所有的sf2项目上工作: @H_403_6@$('#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; });

通常会发送CSRF字段!

并且不要忘记在表单模板中添加枝条标签{{form_rest(form)}},这将生成所有隐藏的字段,如CSRF.

猜你在找的HTML相关文章