Laravel 5.5 ajax gọi 419 (trạng thái không xác định)


145

Tôi thực hiện một cuộc gọi ajax nhưng tôi vẫn nhận được lỗi này:

419 (không rõ tình trạng)

Không biết điều gì gây ra điều này tôi đã thấy trên các bài đăng khác, nó phải làm gì đó với mã thông báo csrf nhưng tôi không có hình thức nên tôi không biết cách khắc phục điều này.

cuộc gọi của tôi:

$('.company-selector li > a').click(function(e) {
     e.preventDefault();

     var companyId = $(this).data("company-id");


      $.ajax({
          headers: {
          'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          },
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {},
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });
  });

Tuyến đường của tôi:

Route::post('fetch-company/{companyId}', 'HomeController@fetchCompany');

Phương pháp điều khiển của tôi

/**
 * Fetches a company
 *
 * @param $companyId
 *
 * @return array
 */
public function fetchCompany($companyId)
{
    $company = Company::where('id', $companyId)->first();

    return response()->json($company);
}

Mục tiêu cuối cùng là hiển thị một cái gì đó từ phản hồi trong phần tử html.


4
bạn có cái này không <meta name="csrf-token" content="{{ csrf_token() }}">
Hanlin Wang

@HanlinWang Không, tôi không có hình thức, đó chỉ là một danh sách thả xuống.
Chris

bạn đã thêm {{csrf_field()}}vào mẫu của bạn ??
Ông Kim tự tháp

3
thả xuống là một phần của biểu mẫu bạn cần thực hiện yêu cầu đó thông qua biểu mẫu
Ông Kim tự tháp

1
hoặc vượt qua csrf_token trong dữ liệu của bạn như thế này{'_token': {{csrf_token()}}}
Ông Kim tự tháp

Câu trả lời:


300

Sử dụng phần này trong phần đầu:

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

và nhận mã thông báo csrf trong ajax:

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

Vui lòng tham khảo Tài liệu của Laravel csrf_token


1
Cảm ơn, nó đã làm việc cho tôi. Tôi đã cố gắng sử dụng phương pháp 'XÓA' cho cuộc gọi ajax và điều này hoạt động như một cơ duyên.
Salvo

4
Tôi đã thiết lập mã chính xác này, nhưng tôi vẫn gặp sự cố của OP trong tình huống sau: người dùng đã đăng nhập, nhưng trang web vẫn không hoạt động trong một thời gian dài (ví dụ: máy tính chuyển sang chế độ ngủ khi mở trình duyệt). Trong trường hợp này, khi người dùng quay lại máy tính và thử một cuộc gọi AJAX, lỗi này xảy ra. Sau khi tải lại, mọi thứ trở lại bình thường. Bất cứ ai có một giải pháp cho điều này?
jovan

@jovan Có hai cách bạn có thể đạt được điều đó một cách dễ dàng. Hãy xem các thư viện jquery tuyệt vời này https://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html https://github.com/kidh0/jquery.idle . Thứ hai, theo yêu cầu ajax của bạn, hãy kiểm tra xem nó có trả về mã lỗi là 419 hay không sau đó chuyển hướng.
riliwanrabo 27/03/18

@jovan Tôi cũng đang vật lộn với điều này và thậm chí đóng trình duyệt, v.v. sẽ không khắc phục được vấn đề. Tôi đã cố gắng tìm cách khắc phục mặc dù và bằng cách đặt dòng mã 'ajaxsetup ()' đã đề cập ở trên cùng với cuộc gọi bài đăng () của tôi - mã thông báo csrf đã được đặt đúng và mọi thứ bắt đầu hoạt động hoàn hảo.
SupaMonkey

2
Nhưng tại sao 419 Unknown status? Tại sao không 419 Invalid CSRF tokenhoặc một số phản ứng hiện có, hữu ích? Nó đến từ đâu? Tại sao? Vv
Rudie

26

Một cách khác để giải quyết vấn đề này là sử dụng _tokentrường trong dữ liệu ajax và đặt giá trị của {{csrf_token()}}lưỡi cắt. Đây là một mã làm việc mà tôi vừa thử ở cuối.

$.ajax({
    type: "POST",
    url: '/your_url',
    data: { somefield: "Some field value", _token: '{{csrf_token()}}' },
    success: function (data) {
       console.log(data);
    },
    error: function (data, textStatus, errorThrown) {
        console.log(data);

    },
});

tiêu đề: {'X-CSRF-TOKEN': $ ('meta [name = "csrf-token"]'). attr ('nội dung')},
Kam Meat

12

Điều này tương tự như câu trả lời của Kannan. Tuy nhiên, điều này khắc phục sự cố không nên gửi mã thông báo đến các trang web tên miền chéo. Điều này sẽ chỉ đặt tiêu đề nếu nó là một yêu cầu cục bộ.

HTML:

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

JS:

$.ajaxSetup({
    beforeSend: function(xhr, type) {
        if (!type.crossDomain) {
            xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
        }
    },
});

Thiết lập tiêu đề bình thường hoạt động với tôi trong một thời gian, nhưng ngẫu nhiên bắt đầu có vấn đề sau nhiều tháng hoạt động tốt. Tôi không hoàn toàn chắc chắn tại sao nó bắt đầu có vấn đề từ đâu cả, nhưng giải pháp này hoạt động rất tốt và khắc phục vấn đề cho tôi.
Frank A.

7

sử dụng điều này trong trang của bạn

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

và trong ajax của bạn đã sử dụng nó trong dữ liệu:

_token: '{!! csrf_token() !!}',

đó là:

$.ajax({
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {
                   _token: '{!! csrf_token() !!}',
                 },
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });

Cảm ơn.


7

Có thể tên miền phiên của bạn không khớp với URL ứng dụng của bạn và / hoặc máy chủ đang được sử dụng để truy cập ứng dụng.

1.) Kiểm tra tệp .env của bạn:

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) Kiểm tra cấu hình / session.php

Xác minh các giá trị để đảm bảo chúng là chính xác.


1
Đây là giải pháp chính xác cho tôi. Rất bực bội, mã HTTP 419 không khớp với thông số HTTP và có thể có nghĩa là rất nhiều thứ.
Cobolt

5

Nếu bạn đã thực hiện các đề xuất trên và vẫn có vấn đề.

Hãy chắc chắn rằng biến env:

SESSION_SECURE_COOKIE

Được đặt thành false nếu bạn không có chứng chỉ SSL, như trên địa phương.


4

trong trường hợp của tôi, tôi đã quên thêm đầu vào csrf_token vào biểu mẫu đã gửi. vì vậy tôi đã làm HTML này:

<form class="form-material" id="myform">
...
<input type="file" name="l_img" id="l_img">
<input type="hidden" id="_token" value="{{ csrf_token() }}">
..
</form>

JS:

//setting containers
        var _token = $('input#_token').val();
        var l_img = $('input#l_img').val();
        var formData = new FormData();
        formData.append("_token", _token);
        formData.append("l_img", $('#l_img')[0].files[0]);

        if(!l_img) {
            //do error if no image uploaded
            return false;
        }
        else
        {
            $.ajax({
                type: "POST",
                url: "/my_url",
                contentType: false,
                processData: false,
                dataType: "json",
                data : formData,
                beforeSend: function()
                {
                    //do before send
                },
                success: function(data)
                {
                    //do success
                },
                error: function(jqXhr, textStatus, errorThrown) //jqXHR, textStatus, errorThrown
                {
                    if( jqXhr.status === "422" ) {
                        //do error
                    } else {
                        //do error
                    }
                }
            });
        }
        return false; //not to post the form physically

1
đây <input type="hidden" id="_token" value="{{ csrf_token() }}">là lỗi ngay cả khi chúng tôi gửi ajax whitouth, nếu không tôi đã gặp một lỗi kỳ lạ 419
Sr.PEDRO

3

Mặc dù bạn có một csrf_token, nếu bạn xác thực các hành động của bộ điều khiển bằng cách sử dụng Laravel, Policiesbạn cũng có thể có phản hồi 419. Trong trường hợp đó, bạn nên thêm các hàm chính sách cần thiết trong Policylớp.


3

Nếu bạn đang tải .js từ một tệp, bạn phải đặt biến với csrf_token trong tệp "chính" .blade.php của bạn nơi bạn đang nhập .js và sử dụng biến trong lệnh gọi ajax của bạn.

index.blade.php

...
...
<script src="{{ asset('js/anotherfile.js') }}"></script>
<script type="text/javascript">
        var token = '{{ csrf_token() }}';
</script>

otherfile.js

$.ajax({
    url: 'yourUrl',
    type: 'POST',
    data: {
        '_token': token
    },
    dataType: "json",
    beforeSend:function(){
        //do stuff
    },
    success: function(data) {
        //do stuff
    },
    error: function(data) {
        //do stuff
    },
    complete: function(){
        //do stuff
    }
});

1

một số giới thiệu =>

...
<head>
    // CSRF for all ajax call
    <meta name="csrf-token" content="{{ csrf_token() }}" />
</head>
 ...
 ...
<script>
    // CSRF for all ajax call
    $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content') } });
</script>
...

1

chỉ cần tuần tự hóa dữ liệu biểu mẫu và giải quyết vấn đề của bạn.

data: $('#form_id').serialize(),

1

Bạn phải lấy mã thông báo csrf ..

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

Sau khi thực hiện cùng một vấn đề, chỉ cần thêm thẻ meta này< meta name="csrf-token" content="{{ csrf_token() }}" >

Sau đó cũng xảy ra lỗi, bạn có thể kiểm tra lỗi Ajax. Sau đó, cũng kiểm tra lỗi Ajax

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});

1
formData = new FormData();
formData.append('_token', "{{csrf_token()}}");
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);

Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp hạn chế, ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
SurePerformance

1

Cập nhật Laravel 2019, Không bao giờ nghĩ rằng tôi sẽ đăng bài này nhưng đối với những nhà phát triển như tôi sử dụng trình duyệt tìm nạp api trên Laravel 5.8 trở lên. Bạn phải chuyển mã thông báo của bạn thông qua tham số tiêu đề.

var _token = "{{ csrf_token }}";
fetch("{{url('add/new/comment')}}", {
                method: 'POST',
                headers: {
                    'X-CSRF-TOKEN': _token,
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(name, email, message, article_id)
            }).then(r => {
                return r.json();
            }).then(results => {}).catch(err => console.log(err));

1

Tôi đã SESSION_SECURE_COOKIEđặt thành đúng vì vậy môi trường dev của tôi không hoạt động khi đăng nhập, vì vậy tôi đã thêm vào SESSION_SECURE_COOKIE=false tệp dev .env của mình và tất cả đều hoạt động tốt, lỗi của tôi là thay đổi tệp session.php thay vì thêm biến vào tệp .env.


0

Lỗi này cũng xảy ra nếu bạn quên bao gồm điều này, trong yêu cầu gửi ajax của bạn (POST), contentType: false, processData: false,


0

Có lỗi này mặc dù tôi đã gửi mã thông báo csrf. Hóa ra không còn chỗ trống trên máy chủ.


0

Điều này hoạt động tuyệt vời cho những trường hợp bạn không yêu cầu một hình thức.

sử dụng điều này trong tiêu đề:

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

và điều này trong mã JavaScript của bạn:

$.ajaxSetup({
        headers: {
        'X-CSRF-TOKEN': '<?php echo csrf_token() ?>'
        }
    });

0

Một cách đơn giản để khắc phục tình trạng không xác định 419 trên bảng điều khiển của bạn là đặt tập lệnh này vào trong MẪU của bạn. {{csrf_field ()}}


0

Điều này làm việc cho tôi:

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': "{{ csrf_token() }}"
  }
});

Sau khi thiết lập cuộc gọi AJAX thông thường. Thí dụ:

    $.ajax({
       type:'POST',
       url:'custom_url',

       data:{name: "some name", password: "pass", email: "test@test.com"},

       success:function(response){

          // Log response
          console.log(response);

       }

    });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.