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 内部服务器错误
Laravel8 | Vuex:POST错误500(内部服务器错误)