点关注按钮返回错误,报419 (unknown status)
来源:1-8 使用多对多模型实现个人中心逻辑3
Tomcath
2020-10-20 17:35:37
# 具体遇到的问题
完全按照课程内容完成的,但是测试的时候点击关注按钮返回419 (unknown status),laravel返回的错误信息看不懂
# 报错信息的截图
# 尝试过的解决思路和结果
网上都说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回答
同学你好,在js文件中headers少写了一个s建议同学进行添加。如下所示:
$.ajaxSetup({ headers : { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });
Tomcath
提问者
2020-10-20
我将关注的请求路径'/user/*/fan' 加入VerifyCsrfToken.php的$except白名单中,成功关注。
所以确定问题是CSRF的问题,但是我完全按照老师和官方资料对AJAX请求laravel附带token信息,为什么会无法通过CSRF验证呢?请问有什么办法解决,毕竟白名单也是有安全风险的
相似问题