document.querySelector (). getAttribute () не получил fre sh мета-имя контента - PullRequest
0 голосов
/ 26 февраля 2020

Я попытался реализовать codeigniter с помощью $config['csrf_regenerate'] = TRUE;

Я создаю код с объединением javascript XMLHttpRequest & Jquery $ .ajaxPrefilter.

Я создаю функцию для получения новых csrf_hash от Codeigniter и добавьте мета-имя на HTML head.

При первом запросе все кажется работающим. Но при следующем запросе получено сообщение 403 Запрещено, потому что ajax отправьте старый файл csrf ha sh.

Пожалуйста, исправьте мой код.

Я хочу перед отправкой запроса POST ajax получить новый csrf ha sh мета-имя формы на HTML голове.

Извините за мой плохой английский sh.

С наилучшими пожеланиями,

Это мой код

$.ajaxPrefilter(function( options, originalOptions, jqXHR ) 
{
    get_csrf_hash(callback =>  document.querySelector('meta[name="csrf_hash"]').setAttribute("content", callback) ); // It Work!!.. Get new csrf_hash and update content meta name.

    if (options.type.toLowerCase() === "post") 
    {
        options.data = $.param($.extend(originalOptions.data, { csrf_simpeg_v2 : document.querySelector('meta[name="csrf_hash"]').getAttribute("content")})); // Not Work didn't send fresh csrf hash
    }

    var originalSuccess = options.success;

    options.success = function(data) 
    {
        if (originalSuccess != null) 
        {
            originalSuccess(data);
        }
    }

    var originalError = options.error;

    options.error = function (jqXHR, textStatus, errorThrown) 
    {
        console.log(jqXHR.status + ' ' + jqXHR.statusText);

        if(jqXHR.status == 401 || jqXHR.status == 403)
        {
            alert(jqXHR.status + ' ' + jqXHR.statusText);
        }
        else
        {
            if(originalError != null) 
            {
                originalError();
            }
        }   
    };
});

function get_csrf_hash(callback)
{
    var url = baseURL + 'login/get_csrf_token';

    var xhr = new XMLHttpRequest();


    xhr.onreadystatechange = function() 
    {
        if (xhr.readyState == XMLHttpRequest.DONE) 
        {
            console.log(xhr.responseText);
            return callback(xhr.responseText);
        }

    }

    xhr.open('GET', url, true);
    xhr.send(null);
}

$(function () {


});

1 Ответ

0 голосов
/ 26 февраля 2020

get_csrf_hash - это асинхронная функция, означающая, что среда выполнения JavaScript не будет ждать, пока она завершит свою задачу, прежде чем перейти к выполнению следующих строк. Вам нужно поместить весь код, который зависит от первого AJAX запроса, внутри обратного вызова:

$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
  get_csrf_hash(callback => {
    document.querySelector('meta[name="csrf_hash"]').setAttribute('content', callback);

    if (options.type.toLowerCase() === 'post') {
      options.data = $.param(
        $.extend(originalOptions.data, {
          csrf_simpeg_v2: document.querySelector('meta[name="csrf_hash"]').getAttribute('content')
        })
      );
    }

    var originalSuccess = options.success;

    options.success = function(data) {
      if (originalSuccess != null) {
        originalSuccess(data);
      }
    };

    var originalError = options.error;

    options.error = function(jqXHR, textStatus, errorThrown) {
      console.log(jqXHR.status + ' ' + jqXHR.statusText);

      if (jqXHR.status == 401 || jqXHR.status == 403) {
        alert(jqXHR.status + ' ' + jqXHR.statusText);
      } else {
        if (originalError != null) {
          originalError();
        }
      }
    };
  });
});

Вам следует обратиться к Fetch API и Promises, Они значительно упростят написание такого кода. Вот get_csrf_hash, переписанный с использованием этих инструментов:

function get_csrf_hash(callback) {
  fetch('login/get_csrf_token')
    .then(res => res.text())
    .then(text => callback(text));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...