TokenMismatchException 在使用 ajax 在 laravel 上的 VerifyCsrfToken.php 第 67 行

Posted

技术标签:

【中文标题】TokenMismatchException 在使用 ajax 在 laravel 上的 VerifyCsrfToken.php 第 67 行【英文标题】:TokenMismatchException in VerifyCsrfToken.php line 67 on laravel using ajax 【发布时间】:2016-10-06 09:58:31 【问题描述】:

此视图有一个调用 javascript 函数的链接

@extends('layouts.main')

@section('content')
    <table class="table">
        <tr>
            <th>ID</th>
            <th>Nombre</th>
            <th>Opción</th>
        </tr>
    @foreach ($tasks as $task)
        <tr>
          <td>$task->id</td>
            <td>$task->name</td>
            <td><a href="javascript:void(0)" onclick="eliminar($task->id)" class="btn btn-danger">Eliminar</a></td>
        </tr>
    @endforeach
    </table>
@stop

这里是javascript代码

function eliminar(id)
  $.ajax(

           type: "DELETE",
           url: "task/"+id,
           success: function (data) 
               console.log(data);
           ,
           error: function (data) 
               alert('Error:', data);
           
    );

通过 ajax 调用,我想调用我的控制器的 destroy 方法

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Task;

class TaskController extends Controller

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    
        $tasks = Task::all();
        return view('mainview',['tasks' => $tasks]);
    

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    
        //
    

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    
        //
    

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    
        //
    

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    
        //
    

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    
        //
    

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    
        return "destroy";
    

但是当我点击链接时,我得到了这个错误:

VerifyCsrfToken.php 第 67 行中的 TokenMismatchException

我是 Laravel 的新手,但我认为 csrf 是用于表单的。

【问题讨论】:

【参考方案1】:

您应该将csrf_field 添加到您的主刀片:

 csrf_field() 

然后将_token 添加到您的请求中:

var _token = $('input[name="_token"]').val();

function eliminar(id)
  $.ajax(
    type: "DELETE",
    url: "task/"+id,
    data:  _token : _token ,
    success: function (data) 
      console.log(data);
    ,
    error: function (data) 
      alert('Error:', data);
    
  );

或者您可以在ajaxSetup 中添加一次,它会影响对$.ajax 或基于Ajax 的派生类(例如$.get())的所有调用:

$.ajaxSetup(

    headers:
    
        'X-CSRF-Token': $('input[name="_token"]').val()
    
);

看看CSRF Protection

希望这会有所帮助。

【讨论】:

【参考方案2】:

这对我有用。我在网上找到了几个答案,但没有一个单独起作用;然而,在结合所有之后,我得到了 Ajax 调用。

    在视图文件的头部,添加以下行:

    <meta name="csrf-token" content="<?php echo csrf_token() ?>"> // This will retrieve the necessary token.
    

    然后,检索令牌的值并将其放在变量上(可选步骤):

    var currentToken = $('meta[name="csrf-token"]').attr('content');
    

    在您的 ajax 调用中,将令牌的值包含在“数据:”字段中:

    $.ajax(type: 'POST', data: _token:currentToken,....);
    

您可以避免在“数据:”字段上为其创建新变量的可选步骤;但是,我发现这一步更容易理解。

希望这会有所帮助。

【讨论】:

【参考方案3】:

您需要在传递“DELETE”方法时添加令牌输入字段。

html

<input class="token" value=" csrf_field() "/>

代码:

function eliminar(id)
  var formData = '_token=' + $('.token').val();
  $.ajax(
           type: "DELETE",
           url: "task/"+id,
           data: formData,
           success: function (data) 
               console.log(data);
           ,
           error: function (data) 
               alert('Error:', data);
           
    );

您还可以将该路由从验证过程中删除,方法是将其添加到中间件中的 except 数组中。

【讨论】:

以上是关于TokenMismatchException 在使用 ajax 在 laravel 上的 VerifyCsrfToken.php 第 67 行的主要内容,如果未能解决你的问题,请参考以下文章

处理 ajax 请求的 TokenMismatchException

删除 db 中的行时出现 TokenMismatchException

对 /autodiscover/autodiscover.xml 的请求导致 TokenMismatchException

TokenMismatchException laravel 5.3

VerifyCsrfToken 中的 TokenMismatchException - Laravel 5.1

laravel中TokenMismatchException异常处理