laravel 5.2 ajax 调用中的 TokenMismatchException

Posted

技术标签:

【中文标题】laravel 5.2 ajax 调用中的 TokenMismatchException【英文标题】:TokenMismatchException in laravel 5.2 ajax call 【发布时间】:2016-06-17 20:20:36 【问题描述】:

我收到令牌不匹配异常,一切似乎都是正确的。

这是我的视图代码

@extends('layouts.master')
@section('content')
<div class="bg"></div>
<div class="login-sec clearfix">

    <h1 class="lg-logo">YOU ARE JUST ONE STEP AHEAD</h1>
    <div class="login-box clear">

        <form id="websiteform" action="#">
            <input type="hidden" name="_token" value=" csrf_token() ">
            <div class="col-md-12 form-field">
                <label for="">Project Name</label>
                <input type="text" name="project" id="project">
            </div>

            <div class="col-md-12 form-field">
                <label for="">Website URL</label>
                <input type="url" name="website_url" id="website_url">
            </div>

            <div class="col-md-12 form-field">
                <button type="submit" class="btn-green btn-large">Add Your Website</button>
            </div>
        </form>

    </div>
</div>
@stop

和表格源头节和页脚是

  <head>
   <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<meta name="csrf-token" content="4ryCSznz0mPSBcwXvbmZZHkZGcxZpyDy2dQ1VAoc" />
<link href="http://localhost:8080/css/bootstrap.min.css" rel="stylesheet" media="screen">

 <script src="http://localhost:8080/js/jquery.min.js"></script>
<script src="http://localhost:8080/js/bootstrap.min.js"></script>
<script src="http://localhost:8080/js/main.js"></script>

和我在 main.js 中的 ajax 调用

$(document).ready(function () 

$.ajaxSetup(
    headers: 
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    
);
$('#websiteform').submit(function(e)
    e.preventDefault();
    var pro=$('#project').val();
    var url=$('#website_url').val();

    $.ajax(
        type: "POST",
        url: "project_save",
        data:  project: pro, url: url,
        success: function(data)
        
            if(data.success==false)
            
             alert(data.error);
            
            else
                window.location =  "dashboard";
            
        ,
        error:function()
    );
);
);

以及路由和控制器功能

 Route::post('/project_save','WebsiteController@project_save');
  public function project_save()

    if(Request::ajax())

        $validator = Validator::make(Request::all(), [
            'project' => 'required|max:255',
            'url' => 'required',
        ]);
        if($validator->fails())
            return Response::json(['success'=>false,'error'=>$validator->errors()->toArray()]);
        

        $Website = new Website;
        $Website->project_name = Request::get('project');
        $Website->website_url = Request::get('url');
        $Website->user_id = Auth::id();
        $Website->save();
        return Response::json(['success'=>true]);
    


这是我的代码,我得到了 tokenmismatach 异常。

【问题讨论】:

移除输入隐藏字段 csrf_token 并检查 该字段不是必需的,但它不会破坏 AJAX 调用 我删除了但同样的问题.. 您真正的标头模板具有 csrf_token() 方法,而不是您在此处显示的静态令牌,对吧? @DenisMysenko 我不明白,对不起,我是 laravel 的新手。 【参考方案1】:

更改您的\App\Http\Middleware\VerifyCsrfToken.php,将此代码添加到函数tokensMatch

if ($request->ajax()) 
        return true;
    

【讨论】:

你提议禁用检查,而不是修复他的特殊情况 它不是正确的答案兄弟,因为只要请求是 ajax,它就会返回真正的仪式? 是的,跳过所有 ajax 请求 如果你这样做,为什么需要 csrf 保护?【参考方案2】:

如果您不想为特定网址提供 CSRF 保护,那么您可以像这样在 App\Http\Middleware\VerifyCsrfToken.php 中添加网址

protected $except = [
    "project_save"
];

【讨论】:

【参考方案3】:

试试这个

$_token = " csrf_token() ";
$.post( 'myurl',  param1: $param1, param2: $param2, _token: $_token )
  .done(function( data )

    console.log('Done!');
);

【讨论】:

不,它没有帮助..同样的问题令牌不匹配... :-( 检查并告诉我 移除 $.ajaxSetup() 函数并保留在那里 试试这个让我知道【参考方案4】:

仔细检查以下内容:

我遇到了类似的问题,而且很容易解决。

将此添加到您的 html 元标记区域:

 <meta name="csrf-token" content=" csrf_token() ">

然后在您的 JQuery 引用下,添加以下代码:

<script type="text/javascript">
      $.ajaxSetup(
        headers: 
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        
      );
  </script>

如果您使用的是 HTML 表单提交(不是 AJAX),那么您需要输入:

 csrf_field()  

在您的表单标签内。

【讨论】:

以上是关于laravel 5.2 ajax 调用中的 TokenMismatchException的主要内容,如果未能解决你的问题,请参考以下文章

允许用户在 laravel 5.2 中进行登录后调用

如何在laravel 5.2中控制多个ajax请求

如何从控制器获取记录到 Ajax laravel 5.2

如何使用 AJAX 渲染部分内容?拉拉维尔 5.2

Laravel 5.2 ajax 更新问题

从其他域登录 laravel 5.2