Symfony2表单与CSRF通过JQuery AJAX

前端之家收集整理的这篇文章主要介绍了Symfony2表单与CSRF通过JQuery AJAX前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个评论框,通过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;   
});

Symfony2控制器

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

$entry = new Discussion();
$discussionForm = $this->createForm(new DiscussionType(),$entry);

if ($request->getMethod() == 'POST') {

    $discussionForm->bindRequest($request);

    if ($discussionForm->isValid()) {

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

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

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

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

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

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

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

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

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

解决方法

尝试使用足够的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;

});

通常会发送CSRF字段!

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

猜你在找的HTML相关文章