Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel5.7Ajax post请求返回419状态代码_Ajax_Laravel_Request_Token_Csrf - Fatal编程技术网

Laravel5.7Ajax post请求返回419状态代码

Laravel5.7Ajax post请求返回419状态代码,ajax,laravel,request,token,csrf,Ajax,Laravel,Request,Token,Csrf,嗨,我是Laravel的新手,我正在尝试用ajax表单提交构建一个登录表单 我复制并构建了一个带有Metronic模板的示例表单,并尝试使用ajax请求进行登录检查 如果我将代码从VerifyCsrfToken检查中排除,那么我的代码可以完全正常工作。但我确实希望令牌验证能够工作 我读过多篇关于csrf令牌的帖子,尝试过,但仍然返回状态码419 很抱歉下面的代码太长,但它们在这里 (我知道我没有做任何关于设置会话和其他内容的事情,请暂时忽略,因为代码仍然返回419状态) routes/web.p

嗨,我是Laravel的新手,我正在尝试用ajax表单提交构建一个登录表单

我复制并构建了一个带有Metronic模板的示例表单,并尝试使用ajax请求进行登录检查

如果我将代码从VerifyCsrfToken检查中排除,那么我的代码可以完全正常工作。但我确实希望令牌验证能够工作

我读过多篇关于csrf令牌的帖子,尝试过,但仍然返回状态码419

很抱歉下面的代码太长,但它们在这里 (我知道我没有做任何关于设置会话和其他内容的事情,请暂时忽略,因为代码仍然返回419状态)

routes/web.php

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>