点关注按钮返回错误,报419 (unknown status)

来源:1-8 使用多对多模型实现个人中心逻辑3

Tomcath

2020-10-20 17:35:37

# 具体遇到的问题

完全按照课程内容完成的,但是测试的时候点击关注按钮返回419 (unknown status),laravel返回的错误信息看不懂
# 报错信息的截图

http://img.mukewang.com/climg/5f8ead150896f86819200422.jpg

http://img.mukewang.com/climg/5f8ead15081ae29519120155.jpg

# 尝试过的解决思路和结果

网上都说Ajax请求laravel出现419,是因为laravel自带CSRF验证没有通过,但是我按照了老师的方法设置了ajax的header,依然没有解决问题。

我关闭浏览器缓存,确保文件都说最新的,在ylaravel.js中通过console.log确认,ajax所需变量,current_like和user_id还有token都已经获取到了。ajax本身没有问题,主要问题在后端

laravel版本5.5

其他js,css与课程完全一致

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

ylaravel.js

$.ajaxSetup({
    header : {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

var editor = new wangEditor('content');
if (editor.config){
    editor.config.uploadImgUrl = '/posts/image/upload';

    // 设置 headers(举例)
    editor.config.uploadHeaders = {
        'X-CSRF-TOKEN' : $('meta[name="csrf-token"]').attr('content')
    };

    editor.create();
}

$(".preview_input").change(function (event) {
    var file = event.currentTarget.files[0];
    var url = window.URL.createObjectURL(file);
    $(event.target).next(".preview_img").attr("src", url);
});

$(".like-button").click(function (event) {
    var target = $(event.target);
    var current_like = target.attr('like-value');
    var user_id = target.attr('like-user');
    if (current_like == 1) {
        //取消关注
        $.ajax({
            url : '/user/' + user_id + '/unfan',
            method : 'POST',
            dataType : 'json',
            success:function (data) {
                if (data.error != 0) {
                    alert(data.msg);
                    return;
                }
                target.attr('like-value',0);
                target.text('关注');
            }
        });
    } else {
        //关注
        $.ajax({
            url : '/user/' + user_id + '/fan',
            method : 'POST',
            dataType : 'json',
            success:function (data) {
                if (data.error != 0) {
                    alert(data.msg);
                    return;
                }
                target.attr('like-value',1);
                target.text('取消关注');
            }
        });
    }
});

like.blade.php

@if($target_user->id != \Auth::id())
<div>
    @if(\Auth::user()->hasStar($target_user->id))
    <button class="btn btn-default like-button" like-value="1" like-user="{{ $target_user->id }}" type="button">取消关注</button>
    @else
    <button class="btn btn-default like-button" like-value="0" like-user="{{ $target_user->id }}" type="button">关注</button>
    @endif
</div>
@endif

UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;

class UserController extends Controller
{
    //个人设置页面
    public function setting()
    {
        $user = \Auth::user();
        return view('user.setting', compact('user'));
    }

    //个人设置保存
    public function settingStore(Request $request)
    {
        //验证 图片格式验证待加
        $this->validate(request(), [
            'name' => 'required|min:3',
        ]);

        //逻辑
        $name = request('name');
        $user = \Auth::user();
        if ($name != $user->name) {
            if (User::where('name',$name)->count() > 0) {
                return back()->withErrors('用户名已被注册');
            }
            $user->name = $name;
        }

        if ($request->file('avatar')) {
            $path = $request->file('avatar')->store('image');
            $user->avatar = '/storage/' . $path;
        }

        $user->save();

        //渲染
        return back();
    }

    //个人中心页面
    public function show(User $user)
    {
        //这个人的信息,用户名,头像,关注数,粉丝数,文章数
        $user = User::withCount(['stars', 'fans', 'posts'])->find($user->id);

        //这个人的文章列表,创建时间最新的前十条
        $posts = $user->posts()->orderBy('created_at', 'desc')->take(10)->get();

        //关注的用户,及用户信息:用户名,关注数,粉丝数,文章数
        $stars = $user->stars;
        $susers = User::whereIn('id', $stars->pluck('star_id'))->withCount(['stars', 'fans', 'posts'])->get();

        //粉丝,及粉丝的用户信息:用户名,关注数,粉丝数,文章数
        $fans = $user->fans;
        $fusers = User::whereIn('id', $fans->pluck('fan_id'))->withCount(['stars', 'fans', 'posts'])->get();

        return view('user.show', compact('user','posts', 'susers', 'fusers'));
    }

    //关注用户(当前用户关注传递进来的用户)
    public function fan(User $user)
    {
        $me = \Auth::user();
        $me->doFan($user->id);
        return [
            'error' => 0,
            'msg' => ''
        ];
    }

    //取消关注
    public function unfan(User $user)
    {
        $me = \Auth::user();
        $me->doUnfan($user->id);
        return [
            'error' => 0,
            'msg' => ''
        ];
    }
}


laravel返回的信息

Response

{

    "message": "",

    "exception": "Symfony\\Component\\HttpKernel\\Exception\\HttpException",

    "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php",

    "line": 203,

    "trace": [

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php",

            "line": 175,

            "function": "prepareException",

            "class": "Illuminate\\Foundation\\Exceptions\\Handler",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/app/Exceptions/Handler.php",

            "line": 51,

            "function": "render",

            "class": "Illuminate\\Foundation\\Exceptions\\Handler",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 83,

            "function": "render",

            "class": "App\\Exceptions\\Handler",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 55,

            "function": "handleException",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php",

            "line": 49,

            "function": "Illuminate\\Routing\\{closure}",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",

            "line": 149,

            "function": "handle",

            "class": "Illuminate\\View\\Middleware\\ShareErrorsFromSession",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 53,

            "function": "Illuminate\\Pipeline\\{closure}",

            "class": "Illuminate\\Pipeline\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php",

            "line": 63,

            "function": "Illuminate\\Routing\\{closure}",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",

            "line": 149,

            "function": "handle",

            "class": "Illuminate\\Session\\Middleware\\StartSession",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 53,

            "function": "Illuminate\\Pipeline\\{closure}",

            "class": "Illuminate\\Pipeline\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php",

            "line": 37,

            "function": "Illuminate\\Routing\\{closure}",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",

            "line": 149,

            "function": "handle",

            "class": "Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 53,

            "function": "Illuminate\\Pipeline\\{closure}",

            "class": "Illuminate\\Pipeline\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php",

            "line": 68,

            "function": "Illuminate\\Routing\\{closure}",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",

            "line": 149,

            "function": "handle",

            "class": "Illuminate\\Cookie\\Middleware\\EncryptCookies",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 53,

            "function": "Illuminate\\Pipeline\\{closure}",

            "class": "Illuminate\\Pipeline\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",

            "line": 102,

            "function": "Illuminate\\Routing\\{closure}",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Router.php",

            "line": 660,

            "function": "then",

            "class": "Illuminate\\Pipeline\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Router.php",

            "line": 635,

            "function": "runRouteWithinStack",

            "class": "Illuminate\\Routing\\Router",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Router.php",

            "line": 601,

            "function": "runRoute",

            "class": "Illuminate\\Routing\\Router",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Router.php",

            "line": 590,

            "function": "dispatchToRoute",

            "class": "Illuminate\\Routing\\Router",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",

            "line": 176,

            "function": "dispatch",

            "class": "Illuminate\\Routing\\Router",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 30,

            "function": "Illuminate\\Foundation\\Http\\{closure}",

            "class": "Illuminate\\Foundation\\Http\\Kernel",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/fideloper/proxy/src/TrustProxies.php",

            "line": 56,

            "function": "Illuminate\\Routing\\{closure}",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",

            "line": 149,

            "function": "handle",

            "class": "Fideloper\\Proxy\\TrustProxies",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 53,

            "function": "Illuminate\\Pipeline\\{closure}",

            "class": "Illuminate\\Pipeline\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",

            "line": 30,

            "function": "Illuminate\\Routing\\{closure}",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",

            "line": 149,

            "function": "handle",

            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 53,

            "function": "Illuminate\\Pipeline\\{closure}",

            "class": "Illuminate\\Pipeline\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",

            "line": 30,

            "function": "Illuminate\\Routing\\{closure}",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",

            "line": 149,

            "function": "handle",

            "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 53,

            "function": "Illuminate\\Pipeline\\{closure}",

            "class": "Illuminate\\Pipeline\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php",

            "line": 27,

            "function": "Illuminate\\Routing\\{closure}",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",

            "line": 149,

            "function": "handle",

            "class": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 53,

            "function": "Illuminate\\Pipeline\\{closure}",

            "class": "Illuminate\\Pipeline\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php",

            "line": 46,

            "function": "Illuminate\\Routing\\{closure}",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",

            "line": 149,

            "function": "handle",

            "class": "Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php",

            "line": 53,

            "function": "Illuminate\\Pipeline\\{closure}",

            "class": "Illuminate\\Pipeline\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",

            "line": 102,

            "function": "Illuminate\\Routing\\{closure}",

            "class": "Illuminate\\Routing\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",

            "line": 151,

            "function": "then",

            "class": "Illuminate\\Pipeline\\Pipeline",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",

            "line": 116,

            "function": "sendRequestThroughRouter",

            "class": "Illuminate\\Foundation\\Http\\Kernel",

            "type": "->"

        },

        {

            "file": "/Applications/MAMP/htdocs/JianShularavel55/public/index.php",

            "line": 55,

            "function": "handle",

            "class": "Illuminate\\Foundation\\Http\\Kernel",

            "type": "->"

        }

    ]

}


写回答

2回答

好帮手慕小尤

2020-10-20

同学你好,在js文件中headers少写了一个s建议同学进行添加。如下所示:

http://img.mukewang.com/climg/5f8eba7509f88a2706330125.jpg

$.ajaxSetup({
    headers : {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
   
});
0

Tomcath

提问者

2020-10-20

我将关注的请求路径'/user/*/fan' 加入VerifyCsrfToken.php的$except白名单中,成功关注。

所以确定问题是CSRF的问题,但是我完全按照老师和官方资料对AJAX请求laravel附带token信息,为什么会无法通过CSRF验证呢?请问有什么办法解决,毕竟白名单也是有安全风险的

0

0 学习 · 721 问题

查看课程