Laravel 4 内部服务器错误 500 和 HTML 表中的 TokenMismatchException 以使用 ajax 更新数据库

Posted

技术标签:

【中文标题】Laravel 4 内部服务器错误 500 和 HTML 表中的 TokenMismatchException 以使用 ajax 更新数据库【英文标题】:Laravel 4 Internal Server Error 500 and TokenMismatchException in a HTML Table to update the database with ajax 【发布时间】:2015-08-20 20:51:39 【问题描述】:

我有一张表格,其中显示了基本信息。它基本上是一个包含 n 行的两列表。

在第二列中,我显示了一个选择标签,用户应该在其中选择一个选项(在本例中是一个国家/地区)。所选选项的对应值将通过 ajax 调用在数据库中更新。

问题是我总是得到这个 500 内部服务器错误和 TokenMismatchException。我是否必须同时使用表单并使用 Form::token() ???

到目前为止我的代码仍然有这个问题如下:

html 表格(视图):

    <div class="row">
        <div class="col-lg-2">
        </div>
        <div class="col-lg-8">
            <table class="table table-striped table-hover">
                <thead>
                    <tr>
                        <th>Printed Media</th>
                        <th>Country</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        @foreach($medios as $medio)
                            <td>$medio->medio</td>
                            <td><select class="select2 req_place" placeholder="Elija" data-select-search="true" 
                                id="medio-$medio->id" name="medio-$medio->id"
                                style="background-color: gray;">
                                    <option selected disabled hidden value=''></option> 
                                @foreach($paises AS $pais)
                                    <option value="$pais->CLAVE">$pais->PAIS</option>
                                @endforeach
                            </select></td>
                            </tr>
                        @endforeach
                </tbody>
            </table>
        </div>
        <div class="col-lg-2">
        </div>
     </div>
 Form::token() 

我添加了 Form::token()

javascript 代码是:

$('select').change(function(e)
    var id_c = jQuery(this).attr("id");
    var result = id_c.split('-');
    var id = result[1];
    var value = $('#'+id_c).val();
    var url_route = "URL::action('DifusionController@post_update_medio')";
    var _token = $("input[name=_token]").val();
    var datos =  id: id, value: value, _token: _token ;
    alert('A country was selected! id: '+id_c + '. Value: '+ value + '. id: '+id);
    alert(url_route); 

    $.post(url_route, datos, function(data,status)
        if(data=='success')
            alert('Success gotten');
        
    );
);

还有我的路线在csrf组内

/**** CSRF protection group ****/
Route::group(array('before'=>'csrf'),function()
    /*Update medios*/
    Route::post('/pendientes/medios',array(
        'as'    =>  'post-update-medio',
        'uses'  =>  'DifusionController@post_update_medio'
        ));
    /*Update reporteros*/
    Route::post('/pendientes/reporteros',array(
        'as'    =>  'post-update-reportero',
        'uses'  =>  'DifusionController@post_update_reportero'
        )); 
...

控制器内部:

public function post_update_medio()

    if (Request::ajax())
    
        $token=Request::header('X-CSRF-Token');// : Input::get('_token');
        $id=Input::get('id');
        $value=Input::get('value');

        if(Input::has('id') && Input::has('value'))
        
            echo 'Medio Posted ☺. ID: '.$id.'. Value: '.$value.' Token: '.$token.' . ';
            /*Update database here*/
            return 'success';
        
        else
        
            return 'error';
                   
    
    else
    
        return 'No ajax request';
    

Chrome 检查器返回以下错误:

error: type: "Illuminate\Session\TokenMismatchException", message: "",…
file: "\MY\PATH\app\filters.php"
line: 179
message: ""
type: "Illuminate\Session\TokenMismatchException"

我必须添加带有令牌的表单吗? 我该如何解决这个问题?

但是现在它在编辑 jquery 代码和控制器后可以工作了

参考资料:

    CSRF tokens when using jQuery Ajax Generating a CSRF token

【问题讨论】:

不,您不需要使用表单,但您确实需要将令牌与您的 AJAX 请求一起发送,作为参数或作为 HTTP 标头。对于第二种方法,您可以查看this nice article。 还有这个one :) 【参考方案1】:

您可以在 HTML 中添加一个标记作为隐藏字段,例如

<input type="hidden" id="token" value="csrf_token() >

然后将其作为 _token 传递给您的 ajax 发布请求

【讨论】:

我试过了,在javascript代码中我添加了var _token = $("input[name=_token]").val();,但仍然得到同样的错误:(。我找到了一个临时解决方案。检查我的编辑。 你不应该使用中间件绕过这个,你可以通过 var token = document.getElementById('token').value; 来获取你的令牌在 html 中的值; 好吧,我没有绕过它,现在我得到了 500 内部服务器错误。那我该如何在控制器内部解决这个问题?我如何在控制器中获取令牌?它似乎不是自动的。 ://

以上是关于Laravel 4 内部服务器错误 500 和 HTML 表中的 TokenMismatchException 以使用 ajax 更新数据库的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 ajax 返回 500 内部服务器错误

内部服务器错误 500 Laravel 5.4 AJAX

Laravel8 | Vuex:POST错误500(内部服务器错误)

Laravel 5.7 ajax 请求 500(内部服务器错误)

Laravel 护照 500 内部服务器错误

在 laravel 5.2 中使用 jquery 和 ajax 出现 500 内部服务器错误