我在弹出警报中使用带有ajax帖子的Laravel 5,它给我错误“500内部服务器错误”,当我检查firebug时,我发现ajax返回错误页面说“VerifyCsrfToken.php中的TokenMismatchException”第46行:“
当我评论App\Http\Middleware\VerifyCsrfToken
时,它运行正常,但我认为不推荐,我打印_token变量并且它不是空的
ajax邮政编码是:
$('#demo_4').click(function(){
bootbox.prompt("What is your name?", function(result) {
if (result === null) {
alert("Prompt dismissed");
} else {
// alert("Hi <b>"+result+"</b>");
$.ajax({
url: 'test',
type: "post",
data: {'name':result, '_token': $('input[name=_token]').val()},
success: function(data){
alert(data);
}
});
}
});
});
路线代码是:
Route::post('test', 'AccountController@login');
AccountController代码是:
<?php
namespace App\Http\Controllers;
use Input;
use Request;
use App\Http\Controllers;
class AccountController extends Controller
{
public function login()
{
if (Request::ajax()) {
$data = Input::all();
print_r($data);
die;
}
}
}
答案 0 :(得分:3)
您需要将此行插入表单
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
或者将其添加到控制器
use Illuminate\Support\Facades\Session
请启用调试器并提供Laravel5调试器显示的更多详细信息。
在ajax调用中将此添加到data
选项:
'_token':$('input[name=_token]').val()
或以全球方式添加
<meta name="_token" content="{!! csrf_token() !!}"/>
并添加到页脚:
<script type="text/javascript">
$.ajaxSetup({
headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') }
});
</script>
UPD:到控制器
use Input;
use Request;
class AccountController extends Controller {
public function login()
{
// Getting all post data
if(Request::ajax()) {
$data = Input::all();
print_r($data);die;
}
}
UPD2:尝试将其添加到主布局
<meta name="_token" content="{!! csrf_token() !!}"/>
<script type="text/javascript">
$.ajaxSetup({
headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') }
});
</script>
检查您的Web服务器是否已具有对会话目录的写访问权限,它可以是app/storage/framework/sessions/
。
执行
rm -f {your_web_app}/storage/framework/sessions/*
重新加载网络服务器。
在某些情况下,使用以下代码检查app/Http/Middleware/VerifyCsrfToken.php
tokensMatch
方法:
$token = $request->ajax() ? $request->header('X-CSRF-Token') : $request->input('_token');
return $request->session()->token() == $token;
并检查javascript文件:
// CSRF protection
$.ajaxSetup(
{
headers:
{
'X-CSRF-Token': $('input[name="_token"]').val()
}
});
答案 1 :(得分:0)
我也遇到过类似的问题
替换
data: {'name':result, '_token': $('input[name=_token]').val()},
同
data: {'name':result, '_token': "$('input[name=_token]').val()"},
在令牌周围放置双引号解决了我的问题。