点关注按钮返回错误,报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>
@endifUserController.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验证呢?请问有什么办法解决,毕竟白名单也是有安全风险的
相似问题