Пытаясь защитить файлы от доступа в первую очередь - PullRequest
0 голосов
/ 16 апреля 2020
function downloadUrl(url, callback) {
    Transition();
    var request = window.ActiveXObject ?
        new ActiveXObject('Microsoft.XMLHTTP') :
        new XMLHttpRequest;

    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            request.onreadystatechange = doNothing;
            callback(request, request.status);
        }
    };

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

function Transition() {
    var xmlhttp = window.ActiveXObject ?
        new ActiveXObject('Microsoft.XMLHTTP') :
        new XMLHttpRequest;

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            xmlhttp.onreadystatechange = doNothing;
            callback(xmlhttp, xmlhttp.status);
        }
    };

    xmlhttp.open("GET", "transition.php", true);
    xmlhttp.send();
}

Ах да, я пытаюсь использовать jQuery и включить переменную сеанса, а после выполнения другой функции jQuery отключить эту переменную сеанса, используя вышеуказанный метод. transition.php - это файл, который включает и выключает переменную, а другая jQuery функция downloadUrl просто загружает файл формата XML.

В итоге у меня есть файл .php, который должен остаться откройте достаточно долго, чтобы получить доступ к данным в нем, затем немедленно закройте.

1 Ответ

0 голосов
/ 16 апреля 2020

Обновление: исправлено несколько формулировок вокруг onreadystatechange и readyState.

Ваш трюк с включением или выключением вещи является изящной идеей, хотя я не уверен, будет ли это работать или безопасно. В любом случае, непосредственная проблема с кодом, который вы показали, заключается в том, что он не учитывает тот факт, что вы используете асинхронные запросы.

Ваш код выполняется в том порядке, в котором он написан, но асинхронные c запросы не задерживают выполнение, поэтому 2-ой XMLHttpRequest до url запускается почти сразу и задолго до первого Transition() завершено.

Если вам нужно, чтобы что-то происходило последовательно, вам необходимо вызвать последующие шаги из обработчика события request onreadystatechange, который запускается при изменении состояния запроса. Код уже проверяется на readyState 4, что означает, что запрос выполнен. Таким образом, вызываемый там код запускается после того, как запрос завершен.

Я не уверен, что делает какой-то ваш код, возможно, он скопирован здесь вне контекста (например, каков ваш * 1022). * и doNothing?).

Вот рабочий JSFiddle на основе вашего кода , использующий фиктивный URL для всех 3 запросов. Я включил кучу журналов, откройте вашу консоль разработчика, чтобы увидеть порядок запуска, запуска и завершения.

Идея состоит в том, чтобы передать обратный вызов в первый Transition, который будет запущен после завершения этого запроса:

function downloadUrl() {
    Transition(foo);
}

Transition принимает обратный вызов в качестве параметра и запускает после завершения:

function Transition(callback) {

    // ... your code ... 

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            if (callback) {
                callback();
            }
        }
    };

    // ... your code

}

Здесь foo() - это функция, которая выполняет фактическую загрузку url, в основном всего, что у вас есть в downloadUrl(), но без вызовов Transition.

Когда foo() завершено, вам нужно снова вызвать Transition, но на этот раз мы не хотим ничего запускать, когда это будет сделано, поэтому мы передаем false, который Transition проверит и пропустит пытаясь выполнить.

Я написал это быстро, и это кажется немного неуклюжим, вы, вероятно, могли бы немного помассировать это, чтобы привести его в порядок, но это демонстрирует основную c идею использования обработчиков событий для выполнения задач последовательно с асин c запросами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...