本地主机上 laravel 5.3 中 ajax 发布请求中的 CSRF 令牌不匹配异常
Posted
技术标签:
【中文标题】本地主机上 laravel 5.3 中 ajax 发布请求中的 CSRF 令牌不匹配异常【英文标题】:CSRF token mismatch exception in ajax post request in laravel 5.3 on localhost 【发布时间】:2017-06-12 21:06:58 【问题描述】:我是 laravel 的新手。我在本地主机上使用 laravel 5.3,我正在使用 ajax 发布请求将数据发布到控制器功能。我已经像这样集成了 CSRF 令牌 在主模板的头部内
<meta name="csrf-token" content=" csrf_token() ">
在包含 jquery 之后我添加了这个脚本
<script type="text/javascript">
$( document ).ready(function()
$.ajaxSetup(
headers:
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
);
console.log($('meta[name="csrf-token"]').attr('content'));
);
</script>
我正在像这样点击按钮发送数据
$.ajax(
type: "POST",
url: './add_to_cart',
data: id:prod_id,name: name,price:price,
success: function( msg )
);
第一次调用正确,没有错误。但是第一次调用后每次调用都会返回错误
VerifyCsrfToken.php 第 67 行中的 TokenMismatchException:
这是错误截图:
【问题讨论】:
【参考方案1】:调用带有未单独包含的标头的 ajax 函数。 我相信你的元标签是这样的
<meta name="csrf-token" content=" csrf_token() ">
喜欢这个
$.ajax(
type: "POST",
url: '/add_to_cart',
headers: 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
data: id:prod_id,name: name,price:price,
success: function( msg )
);
所以每次ajax调用完成时,Header都会包含csrf_token()
。
【讨论】:
感谢 naveen 的回复。我已包含与您描述的相同的元标记。我已经尝试了您的解决方案,但仍然出现相同的错误。第一次调用没有错误,但之后它抛出异常。 我也检查了标头,每个请求都包含 csrf 令牌,但仍然不知道是什么问题 你能检查/add_to_cart
路由是否有api
或web
中间件。如果是网络,则可能是一个问题,因为令牌会随着每个 POST 请求而改变。将其更改为api
。使用 Laravel 5.3 确保路由在 routes/api.php
文件中。
所有默认路由都应该在 web.php 中,除了 api 路由。 @ChrisCynarski。除非他在创建api,否则他不需要改变
@Chris Cynarski 我不是在创建 api,我正在开发网络。【参考方案2】:
我认为你应该试试这个:
<meta name="csrf-token" content=" csrf_token() ">
$.ajax(
type: "POST",
url: './add_to_cart',
headers: 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
data: "_token": " csrf_token() ",id:prod_id,name: name,price:price,
success: function( msg )
);
希望这对你有用!
【讨论】:
感谢大家的帮助,我已经尝试了所有提供的解决方案,但问题没有解决 @Naveen Kumar 我已经尝试了令牌正在生成的代码,但是给出令牌不匹配异常的响应看看在AJAX请求的chrome控制台截图screencast.com/t/gntfBMuhlLf 您的解决方案没有为令牌赋值 请看截图screencast.com/t/ptnBaziuruZ【参考方案3】:在仔细检查了我的代码之后,我发现这段代码就是这样做的。 会话::flush();删除此问题后解决。 特别感谢大家的努力@Naveen Kumar
【讨论】:
【参考方案4】:如果您使用 URL“http://localhost:8000/”访问发送数据的页面 将您用于发出请求的 url 更改为“http://localhost:8000/”
地址栏中的基本 url 和您用来发出请求的基本 url 应该相同。这个想法是发出请求的域必须与发出请求的网站的域相同。 CSRF攻击研究
【讨论】:
以上是关于本地主机上 laravel 5.3 中 ajax 发布请求中的 CSRF 令牌不匹配异常的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.2 session flash 在本地主机上工作但在服务器上不工作?