Laravel5.7Ajax post请求返回419状态代码
嗨,我是Laravel的新手,我正在尝试用ajax表单提交构建一个登录表单 我复制并构建了一个带有Metronic模板的示例表单,并尝试使用ajax请求进行登录检查 如果我将代码从VerifyCsrfToken检查中排除,那么我的代码可以完全正常工作。但我确实希望令牌验证能够工作 我读过多篇关于csrf令牌的帖子,尝试过,但仍然返回状态码419 很抱歉下面的代码太长,但它们在这里 (我知道我没有做任何关于设置会话和其他内容的事情,请暂时忽略,因为代码仍然返回419状态) routes/web.phpLaravel5.7Ajax post请求返回419状态代码,ajax,laravel,request,token,csrf,Ajax,Laravel,Request,Token,Csrf,嗨,我是Laravel的新手,我正在尝试用ajax表单提交构建一个登录表单 我复制并构建了一个带有Metronic模板的示例表单,并尝试使用ajax请求进行登录检查 如果我将代码从VerifyCsrfToken检查中排除,那么我的代码可以完全正常工作。但我确实希望令牌验证能够工作 我读过多篇关于csrf令牌的帖子,尝试过,但仍然返回状态码419 很抱歉下面的代码太长,但它们在这里 (我知道我没有做任何关于设置会话和其他内容的事情,请暂时忽略,因为代码仍然返回419状态) routes/web.p
Route::post('/auth/login', array('uses' => 'Auth\LoginController@postLogin'))->name('login');
Route::get('/landing', array('uses' => 'IndexController@landing'))->name('landing');
login.blade.php
<head>
<meta charset="utf-8" />
<title>{{ config('app.name') }} ({{ config('app.env') }})</title>
<meta name="description" content="Latest updates and statistic charts">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, shrink-to-fit=no">
<meta name="csrf-token" content="{{ csrf_token() }}">
<!--
Global css & js here
-->
</head>
<body>
<form class="m-login__form m-form" method="post" action="{{ route('login') }}">
@csrf
<!--
Form content here
-->
</form>
<!--begin::Page Scripts -->
<script type="text/javascript">
var form_action = '{{ route('login') }}';
</script>
<script src="{{ URL::asset('login.js')}}" type="text/javascript"></script>
<!--end::Page Scripts -->
</body>
验证\登录控制器
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\URL;
use Response;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/landing';
public function __construct()
{
$this->middleware('guest')->except('logout');
}
public function postLogin(Request $request) {
$auth = false;
$credentials = $request->only('email', 'password', 'remember_token');
if (Auth::attempt($credentials, $request->has('remember_token'))) {
$auth = true; // Success
}
if($auth){
if ($request->ajax()){
$response = array(
'auth' => true,
'code' => 101,
'intended' => URL::route('landing')
);
}
else{
$response = array(
'auth' => true,
'code' => 102,
'intended' => URL::route('landing')
);
}
return Response::json($response);
}
else{
$response = array(
'status' => 'error',
'msg' => 'Error',
);
return Response::json($response);
}
}
}
部分响应错误
message: "", exception: "Symfony\Component\HttpKernel\Exception\HttpException",…}
exception: "Symfony\Component\HttpKernel\Exception\HttpException"
file: "/var/www/imas/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php"
line: 204
message: ""
更新:
我把所有东西都放在一个php文件中,把csrf令牌元放在脚本的head+ajaxsetup中,仍然得到419状态码
(注意:“test123”是路由文件中的post方法)
{{config('app.name')}}({{config('app.env')})
WebFont.load({
谷歌:{“家族”:[“罂粟花:300400500600700”,“机器人:300400500600700”],
活动:函数(){
sessionStorage.fonts=true;
}
});
@产量('pagespecificstyles')
@包括('admin.top')
@包括('admin.sidenav')
名称:
密码:
@包括('admin.footer')
@包括('admin.scrolltop')
@包括('admin.script')
@产量('pagespecificscripts')
var formPath='{route('test123')}}';
$(文档).ready(函数(){
$.ajaxSetup({
标题:{
'X-CSRF-TOKEN':$('meta[name=“CSRF-TOKEN”]).attr('content'))
}
});
$('btn_submit')。单击(函数(){
var formData=$('#form1').serialize();
$.ajax({
类型:'POST',
url:formPath,
数据:formData,
成功:功能(数据){
警报(数据);
}
});
});
});
在标题部分HTML中使用此选项:
<head>
<meta name="csrf-token" content="{{ csrf_token() }}" />
</head>
在您的ajax中,将其用于数据:
<script>
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content') } });
</script>
$.ajaxSetup({headers:{'X-CSRF-TOKEN':jQuery('meta[name=“CSRF-TOKEN”]')).attr('content')});
请参阅Laravel文档您的路线是否在“->name('xxxx')”之后添加了“->中间件('web')”,不,luckHmm不确定它是否会影响,但尝试删除一个csrf令牌,您通过了2,一个来自
,另一个来自ajax的标题
meta标记已经在login.blade的头部。问题可能是jquery/js脚本被另一个.js文件分隔开了吗?(因为我在.js文件中尝试了$.ajaxSetup,但没有帮助)
<head>
<meta name="csrf-token" content="{{ csrf_token() }}" />
</head>
<script>
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content') } });
</script>