लारवेल 5.5 अजाक्स कॉल 419 (अज्ञात स्थिति)


145

मैं एक अजाक्स कॉल करता हूं लेकिन मुझे यह त्रुटि मिलती रहती है:

419 (अज्ञात स्थिति)

पता नहीं यह किस कारण से हो रहा है, मैंने अन्य पदों पर देखा कि इसमें सीएसआरएफ टोकन के साथ कुछ करना है लेकिन मेरे पास कोई फॉर्म नहीं है इसलिए मुझे नहीं पता कि इसे कैसे ठीक किया जाए।

मेरा बुलावा:

$('.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);
          }
     });
  });

मेरा मार्ग:

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

मेरी नियंत्रक विधि

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

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

अंतिम लक्ष्य एक html तत्व में प्रतिक्रिया से कुछ प्रदर्शित करना है।


4
क्या आपके पास यह था? <meta name="csrf-token" content="{{ csrf_token() }}">
हनलिन वांग

@ हेनलिनवांग नहीं, मेरे पास ऐसा कोई फॉर्म नहीं है जो सिर्फ एक ड्रॉपडाउन है।
क्रिस

क्या आपने {{csrf_field()}}अपने फॉर्म में जोड़ा है ??
श्री पिरामिड

3
ड्रॉपडाउन फॉर्म का एक हिस्सा है जिसे आपको फॉर्म के माध्यम से अनुरोध करने की आवश्यकता है
श्री पिरामिड

1
या अपने डेटा में csrf_token को इस तरह से पास करें{'_token': {{csrf_token()}}}
श्री पिरामिड

जवाबों:


300

इसका उपयोग हेड सेक्शन में करें:

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

और अजाक्स में सीएसआरएफ टोकन प्राप्त करें:

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

कृपया लारवेल डॉक्यूमेंटेशन csrf_token देखें


1
धन्यवाद, यह मेरे लिए काम किया। मैं ajax कॉल के लिए 'DELETE' पद्धति का उपयोग करने की कोशिश कर रहा था और यह एक आकर्षण की तरह काम करता था।
साल्वो

4
मेरे पास यह सटीक कोड सेट अप है, लेकिन मैं अभी भी निम्न स्थिति में ओपी की समस्या का सामना कर रहा हूं: उपयोगकर्ता लॉग इन है, लेकिन साइट लंबे समय तक निष्क्रिय रहती है (उदाहरण के लिए, कंप्यूटर ब्राउज़र ओपन के साथ सो जाता है)। इस स्थिति में, जब उपयोगकर्ता कंप्यूटर पर वापस जाता है और AJAX कॉल का प्रयास करता है, तो यह त्रुटि होती है। पुनः लोड होने के बाद, सब कुछ वापस सामान्य हो जाता है। किसी के पास इसका कोई हल है?
जोवन

@ जोवान दो तरीके हैं जिनसे आप आसानी से हासिल कर सकते हैं। इन भयानक jQuery पुस्तकालयों पर एक नजर डालें https://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html https://github.com/kidh0/jquery.idle । दूसरे, आपके ajax अनुरोध पर, जांचें कि क्या यह 419 का त्रुटि कोड देता है, फिर रीडायरेक्ट करता है।

@ जोवन मैं भी इससे जूझ रहा था और ब्राउजर को बंद करना आदि मुद्दे को ठीक नहीं कर रहा था। मैं यह पता लगाने में कामयाब रहा कि इसे कैसे ठीक किया जाए और ऊपर उल्लिखित 'ajaxsetup ()' कोड की लाइन को मेरे पोस्ट के बिना उल्लिखित करके () कॉल करें - सीएसआरएफ टोकन ठीक से सेट हो गया और सब कुछ त्रुटिपूर्ण रूप से काम करना शुरू कर दिया।
सुपरमॉन्की

2
लेकिन क्यों 419 Unknown status? क्यों नहीं 419 Invalid CSRF tokenया कुछ मौजूदा, उपयोगी प्रतिक्रिया? यह कहां से आता है? क्यों? आदि
रुडी

26

इसे हल करने का एक और तरीका है _tokenअजाक्स डेटा में फ़ील्ड का उपयोग करना और {{csrf_token()}}ब्लेड का मान सेट करना । यहाँ एक काम करने वाला कोड है जिसे मैंने अपने अंत में आज़माया है।

$.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);

    },
});

शीर्षलेख: {'X-CSRF-TOKEN': $ ('मेटा [नाम = "csrf-token"]))। attr (' सामग्री ')},
कमलेश

12

यह कन्नन के जवाब के समान है। हालाँकि, यह एक समस्या को हल करता है जहां टोकन को क्रॉस-डोमेन साइटों पर नहीं भेजा जाना चाहिए। यह केवल हेडर सेट करेगा यदि यह एक स्थानीय अनुरोध है।

HTML:

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

जे एस:

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

सामान्य हेडर सेटअप ने कुछ समय के लिए मेरे लिए काम किया, लेकिन महीनों तक काम करने के बाद बेतरतीब ढंग से काम करना शुरू कर दिया। मुझे पूरी तरह से यकीन नहीं है कि यह कहीं से भी समस्या क्यों शुरू हुई, लेकिन इस समाधान ने बहुत काम किया और मेरे लिए इस मुद्दे को तय किया।
फ्रैंक ए।

7

इसे अपने पेज में उपयोग करें

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

और आपके अजाक्स में डेटा में इसका इस्तेमाल किया:

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

अर्थात्:

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

धन्यवाद।


7

यह संभव है कि आपका सत्र डोमेन आपके एप्लिकेशन URL और / या एप्लिकेशन तक पहुंचने के लिए उपयोग किए जा रहे होस्ट से मेल न खाए।

1.) अपने .env फ़ाइल की जाँच करें:

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) config / session.php चेक करें

यह सुनिश्चित करने के लिए मानों को सत्यापित करें कि वे सही हैं।


1
यह मेरे लिए सही समाधान था। बहुत निराशा होती है, HTTP 419 कोड HTTP कल्पना से मेल नहीं खाता है और बहुत सारी चीजों का मतलब हो सकता है।
कोबोल्ट

5

यदि आपने पहले ही उपरोक्त सुझाव दिए हैं और अभी भी समस्या है।

सुनिश्चित करें कि env चर:

SESSION_SECURE_COOKIE

false यदि आपके पास एसएसएल प्रमाणपत्र नहीं है, तो स्थानीय पर सेट करें ।


4

मेरे मामले में मैं सबमिट किए गए फॉर्म में csrf_token इनपुट जोड़ना भूल गया। इसलिए मैंने यह HTML किया:

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

जे एस:

//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
इस <input type="hidden" id="_token" value="{{ csrf_token() }}">आवश्यक है भले ही हम एक whitouth ajax प्रस्तुत करते हैं, अन्यथा मैं एक अजीब 419 त्रुटि मिली
Sr.PEDRO

3

भले ही आपके पास एक है csrf_token, अगर आप लारवेल का उपयोग करके अपने नियंत्रक कार्यों को प्रमाणित करते हैं तो आपके Policiesपास 419 प्रतिक्रिया हो सकती है। उस स्थिति में आपको अपनी Policyकक्षा में आवश्यक नीतिगत कार्य जोड़ना चाहिए ।


3

यदि आप एक फ़ाइल से .js लोड कर रहे हैं, तो आपको अपनी "मुख्य" .blade.php फ़ाइल में csrf_token के साथ एक चर सेट करना होगा जहाँ आप .js आयात कर रहे हैं और अपने ajax कॉल में चर का उपयोग करें।

index.blade.php

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

anotherfile.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

कुछ रेफ्स =>

...
<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

आपको सीएसआरएफ टोकन प्राप्त करना होगा।

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

एक ही मुद्दा उठने के बाद, बस इस मेटा टैग को जोड़ें< meta name="csrf-token" content="{{ csrf_token() }}" >

इसके बाद भी त्रुटि उत्पन्न होती है, तो आप अजाक्स त्रुटि की जांच कर सकते हैं। फिर अजाक्स त्रुटि की भी जांच करें

$.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);

इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखाते हुए इसके दीर्घकालिक मूल्य में बहुत सुधार करेगा और यह भविष्य के पाठकों के लिए अन्य, समान प्रश्नों के साथ अधिक उपयोगी होगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
23

1

2019 लारवेल अपडेट, कभी नहीं सोचा था कि मैं इसे पोस्ट करूंगा लेकिन मेरे जैसे उन डेवलपर्स के लिए जो कि 5.8 और इसके बाद के संस्करण पर ब्राउजर एची एप का उपयोग कर रहे हैं। आपको हेडर पैरामीटर के माध्यम से अपना टोकन पास करना होगा।

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

मैंने SESSION_SECURE_COOKIEसच में सेट किया था ताकि लॉग इन करते समय मेरा देव परिवेश काम न करे, इसलिए मैंने SESSION_SECURE_COOKIE=false अपनी देव .env फ़ाइल में जोड़ा और सभी काम ठीक हैं मेरी गलती से .env फ़ाइल में चर जोड़ने के बजाय सत्र .php फ़ाइल बदल रही थी।


0

यह त्रुटि तब भी होती है यदि आप इसे शामिल करना भूल गए हैं, आपके ajax सबमिशन रिक्वेस्ट (POST) में, कंटेंट टाइप: false, processData: false,


0

भले ही मैं पहले से ही csrf टोकन भेज रहा था, यह त्रुटि हुई। पता चला कि सर्वर पर अधिक जगह नहीं बची थी।


0

यह उन मामलों के लिए बहुत अच्छा काम करता है जिनके लिए आपको एक फॉर्म की आवश्यकता नहीं है।

हेडर में इसका उपयोग करें:

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

और यह आपके जावास्क्रिप्ट कोड में है:

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

0

अपने कंसोल पर 419 अज्ञात स्थिति को ठीक करने का एक सरल तरीका इस स्क्रिप्ट को अपने FORM के अंदर रखना है। {{csrf_field ()}}


0

यह मेरे लिए काम किया:

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

इसके बाद नियमित AJAX कॉल सेट करें। उदाहरण:

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

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

       success:function(response){

          // Log response
          console.log(response);

       }

    });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.