[php] Laravel 5.5 Ajax Call 419 (알 수없는 상태)

나는 아약스 호출을하지만이 오류가 계속 발생합니다 :

419 (알 수없는 상태)

이것이 다른 게시물에서 본 원인이 무엇인지 전혀 모릅니다 .csrf 토큰으로 무언가를해야하지만 양식이 없으므로이 문제를 해결하는 방법을 모릅니다.

내 전화 :

$('.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 요소로 표시하는 것입니다.



답변

헤드 섹션에서 이것을 사용하십시오.

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

ajax에서 csrf 토큰을 얻으십시오.

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

Laravel Documentation csrf_token을 참조하십시오


답변

이를 해결하는 또 다른 방법 _token은 ajax 데이터 에서 필드 를 사용하고 {{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);

    },
});


답변

이것은 Kannan의 답변과 비슷합니다. 그러나 이렇게하면 토큰을 도메인 간 사이트로 보내지 않아야하는 문제가 해결됩니다. 로컬 요청 인 경우에만 헤더를 설정합니다.

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'));
        }
    },
});


답변

귀하의 페이지에서 이것을 사용하십시오

<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);
          }
     });

감사.


답변

세션 도메인이 앱 URL 및 / 또는 애플리케이션에 액세스하는 데 사용되는 호스트와 일치하지 않을 수 있습니다.

1.) .env 파일을 확인하십시오.

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) config / session.php 확인

값이 올바른지 확인하십시오.


답변

위의 제안을 이미 수행했지만 여전히 문제가있는 경우

env 변수가 다음을 확인하십시오.

SESSION_SECURE_COOKIE

로컬과 같이 SSL 인증서가없는 false 경우로 설정됩니다 .


답변

제 경우에는 제출 된 양식에 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>

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