在laravel中使用AJAX防止TokenMismatch异常的方法

时间:2017-06-29 07:58:56

标签: php laravel laravel-5.2 laravel-5.1 laravel-5.3

我已经分析了获取令牌不匹配错误的比例非常高。而这个错误因为一些愚蠢的错误而得到。开发人员犯错的原因有很多。以下是一些示例。

  1. 不在标头上发送_token
  2. 使用ajax时,不会在数据上发送_token
  3. 存储路径上的不许可。
  4. 无效的会话存储路径。
  5. 还有很多其他原因,请随时编辑此问题以获取更多防止此类错误的方法。

1 个答案:

答案 0 :(得分:4)

可能的变化 - 1

在标题上设置令牌

<head>视图的default.blade.php上设置令牌

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

在脚本顶部添加ajaxSetup,随处可访问。这将在每个ajax调用上设置标题

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

<form>代码

上设置代币

将以下功能添加到您的<form>标记中。此函数将生成一个名为_token的隐藏字段,并使用标记

填充值
{{csrf_field()}}

csrf_token()功能添加到隐藏的_token值属性中。这将只生成加密字符串。

<input type="hidden" name="_token" value="{{csrf_token()}}"/>

可能的变化 - 2

检查会话存储路径&amp;许可

此处假设项目应用网址为APP_URL=http://project.dev/ts/toys-store

  1. 将写入权限设置为storage_path('framework/sessions')
  2. 检查laravel项目'path' => '/ts/toys-store',的路径 这条道路是你的laravel项目的根源。
  3. 更改Cookie的名称'cookie' => 'toys-store',

    return [
        'driver' => env('SESSION_DRIVER', 'file'),
        'lifetime' => 120,
        'expire_on_close' => false,
        'encrypt' => false,
        'files' => storage_path('framework/sessions'),
        'connection' => null,
        'table' => 'sessions',
        'lottery' => [2, 100],
        'cookie' => 'toys-store',
        'path' => '/ts/toys-store',
        'domain' => null,
        'secure' => false,
        'http_only' => true,
    ];
    
  4. 可能的变化 - 3

    在AJAX上使用_token字段

    有很多方法可以在AJAX调用上发送_token

    1. 使用<form>
    2. var formData = new FormData($("#cart-add")[0]);代码中获取所有输入字段的值
    3. 使用$("#cart-add").serialize();$("#cart-add").serializeArray();
    4. 手动添加_token AJAX数据。使用$('meta[name="csrf-token"]').attr('content')$('input[name="_token"]').val()
    5. 我们可以在特定的ajax调用上设置为标头,如下面的代码。

      $.ajax({
          url: "path/to/ajax",
          type: "POST",
          data: formData,
          processData: false,
          contentType: false,
          dataType: "json",
          headers: {
              'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          }
      });