codememo

Yii 2를 사용하여 Ajax 호출에서 잘못된 요청(#400)을 받는 중

tipmemo 2023. 8. 16. 22:24
반응형

Yii 2를 사용하여 Ajax 호출에서 잘못된 요청(#400)을 받는 중

내 코드는 다음과 같습니다.

$(document).on('change', '#tblhotel-int_zone_id', function(e){
    var zoneId = $(this).val();
    var form_data = {
        zone: zoneId
    };
    $.ajax({
        url: "state",
        type: "POST",
        data: form_data,
        success: function(response)
        {
            alert(response);
        }
    });
});

표시되는 내용:

잘못된 요청(#400):데이터 제출을 확인할 수 없습니다.

그리고 나는 이미.<?= Html::csrfMetaTags() ?>이 문제를 어떻게 해결할 수 있습니까?

참고: Skullcrasher의 답변을 참조하여 올바른 방법으로 문제를 해결하십시오. 제 답변은 사이트요청 위조를 비활성화하는 것을 제안합니다.


CsrfValidation을 사용하는 데 문제가 있습니다.자세한 내용은 여기를 참조하십시오.

CSRF를 비활성화하려면 컨트롤러에 다음 코드를 추가합니다.

public function beforeAction($action) {
    $this->enableCsrfValidation = false;
    return parent::beforeAction($action);
}

이렇게 하면 모든 작업이 비활성화됩니다.$action에 따라 특정 작업에 대해서만 비활성화해야 합니다.

Mihai P.의 답변에 따르면, 당신의 문제는 CSRF 검증입니다.또한 작업에 대한 유효성 검사를 사용하지 않도록 설정할 수 있지만 이 방법은 좋은 해결책으로 간주되지 않습니다.

Ajax 요청에 유효성 검사에 문제가 있으므로 Yi JavaScript 함수를 사용하여 Ajax 요청으로 전송하는 양식 데이터에 CSRF 토큰을 추가할 수도 있습니다.

다음과 같이 양식 데이터에 토큰을 추가해 보십시오.

var form_data = {
    zone: zoneId,
    _csrf: yii.getCsrfToken()
};

이것이 도움이 되기를 바라며 따라서 CSRF 유효성 검사를 비활성화할 필요가 없습니다.

CSRF 토큰을 수동으로 추가하는 것 외에도 요청에 X-CSRF 헤더가 설정되어 있는지 확인할 수 있습니다.

레이아웃 하단에 이 코드를 추가합니다.

<script>
    $.ajaxSetup({
        data: <?= \yii\helpers\Json::encode([
            \yii::$app->request->csrfParam => \yii::$app->request->csrfToken,
        ]) ?>
    });
</script>

사용:

var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
    url: 'request',
    type: 'post',
    dataType: 'json',
    data: {param1: param1, _csrf : csrfToken},
});

자세한 내용:Yi2: csrf 토큰 사용

다음 작업 전 기능에서 CSRF 유효성 검사를 비활성화해야 합니다.

public function beforeAction($action) {
    if($action->id == "action name need to disable")
        $this->enableCsrfValidation = false;
    return parent::beforeAction($action);
}

또는 GET 방법을 사용합니다.

효과가 있습니다.Config/main.php에서 csrfParam을 자신의 것으로 변경합니다.

'components' => [
    'request'=>[
        'csrfParam'=>"othername"
    ],
    ...

구성에서 정의한 이름과 동일한 이름의 토큰을 요청에 포함해야 합니다.

답변이 많은 오래된 게시물이지만 게시된 모든 답변에서 누락된 점이 있음에도 불구하고 모두 정확한 점을 언급했지만 아약스를 부를 때POST당신의 데이터와 함께 당신은 사용해야 합니다.yii.js제공된 기능

  • yii.getCsrfParam()토큰의 매개 변수 이름을 가져옵니다.
  • yii.getCsrfToken()csrf-cisco의 토큰 또는 실제 값을 가져옵니다.

내부에 정의된 프런트 엔드에 대해 다른 매개 변수 이름이 있는 것처럼config.php또는web.php의 밑에request구성 요소구성

components=>[
.......
.......
    'request' => [
        'csrfParam' => '_csrf-frontend',
    ],
.......
.......
]

그러면 당신은 그 이름을 동적으로 얻어야 하고 위의 기능이 당신을 도와줍니다.

당신은 그래야 한다.

var form_data = {
    zone: zoneId
};
form_data[yii.getCsrfParam()]=yii.getCsrfToken();

/vmx/config/main-local.vmx

'components' => [
    'request' => [
        'cookieValidationKey' => 'unique code',
        'csrfCookie' => ['httpOnly' => true, 'path' => '/admin/'],
    ],
],

/frontend/config/main-local.dll

'components' => [
    'request' => [
        'cookieValidationKey' => 'unique code',
        'csrfCookie' => ['httpOnly' => true, 'path' => '/'],
    ],
],

언급URL : https://stackoverflow.com/questions/27126050/getting-bad-request-400-on-ajax-calls-using-yii-2

반응형