Как бороться с тайм-аутами сеанса в AJAX-запросах - PullRequest
14 голосов
/ 17 июня 2009

Я уверен, что вы все знакомы с системами голосования, использующими AJAX (хм ... посмотрите прямо здесь <----) </p>

У меня есть нечто похожее, и когда вы голосуете "за" или "против", он использует AJAX для запроса нового значения из voices.php. Проблема в том, что я использую сеанс, чтобы получить идентификатор пользователя, чтобы человек мог голосовать только один раз. Что произойдет, если они сидят на странице в течение часа, а затем голосуют, чтобы сеанса больше не было? Что было бы хорошим способом справиться с этой ситуацией? Должен ли я перенаправить их страницу на экран входа? Если да, то как я могу это сделать на странице voices.php, на которую ссылается запрос AJAX? Я пропускаю хороший способ справиться с этой ситуацией? Любой совет будет полезен.

Ответы [ 6 ]

11 голосов
/ 17 июня 2009

Рассмотрите возможность возврата статуса http 401 и объекта JSON с подробным описанием причины. Если вы используете jQuery, это приведет к обратному вызову error(), который вы затем сможете проанализировать.

$.ajax({
  data: {},
  dataType: 'html',
  success: function(data) {
    // do whatever here
  },
  type: 'POST',
  url: 'myserver.com',
  error: function(XMLHttpRequest, textStatus, errorThrown) {
    // XMLHttpRequest.responseText has your json string
    // XMLHttpRequest.status has the 401 status code
    if (XMLHttpRequest.status === 401) {
      location.href = 'login.php';
    }
  }
});

Я больше не знаком с PHP, но это должно работать практически в любой среде. Вы возможно должны подавить любое автоматическое перенаправление формы входа. В asp.net mvc фреймворк увидит 401 и вернет форму входа по умолчанию обратно со статусом 200.

1 голос
/ 04 июля 2011

Это старая ветка, но я хотел бы поделиться своим решением, которое действительно хорошо работает.

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

<!--LOGINFORM-->

Я создал оболочку для функции $ .ajax jQuery, которая проверяет эту строку при каждом запросе, и, если она есть, показывает всплывающее диалоговое окно, сообщающее, что время их сеанса истекло.

Вы можете использовать это, просто позвонив:

ajax.get('http://someurl.com', function(data){
    //Do stuff
});

Надеюсь, это кому-нибудь поможет.

var ajax = {
    check_login : function(resp){
        if (resp.substring(0, 16) === "<!--LOGINFORM-->"){
            // Show a popup or redirect them to login page!
            return true;
        }
        return false;
    },
    get : function(url, success){       
        if (typeof data =='undefined'){
            data = null;
        }

        $.ajax({
            url: url,
            type : 'GET',
            success : function(resp){
                if (!ajax.check_login(resp)) {
                    success(resp);
                }
            },
        });
    }   
};
1 голос
/ 17 июня 2009

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

Если ваша проблема связана с тайм-аутом сеансов пользователей, вам следует пересмотреть то, как вы используете сеансы. Возможно, заставит их работать до тех пор, пока браузер не закроется? Если вы действительно хотите сделать их длительными, то, возможно, пропишите серверы через определенные промежутки времени, чтобы поддержать сеанс.

Решите в своем php-скрипте, должен ли пользователь иметь возможность голосовать. Если сеанс не установлен или если они уже проголосовали, верните сообщение, которое вы можете идентифицировать на стороне клиента. Если они уже проголосовали, возможно, верните "voted":"true" в объекте JSON. Используйте JS, чтобы разобрать этот объект и понять, что это значит, выполнив соответствующее действие. Если сеанс не установлен, возможно, верните "session_set":"false", а затем сделайте переадресацию JavaScript с помощью window.location = "login.php" и т. Д.

Увеличивать счетчик для пользователя только при успешном возврате подсчитанного голоса.

0 голосов
/ 17 июня 2009

С точки зрения пользователя, лучшим решением является всплывающее сообщение и форма входа в систему, где говорится что-то вроде: «Вы не вошли в систему или время сеанса истекло». Дигг делает это очень хорошо.

Что касается фактической реализации AJAX, предложение 401 от swilliams вполне обоснованно. В качестве альтернативы, вы можете просто вернуть определенную строку при ошибке.

0 голосов
/ 17 июня 2009

Вы могли бы создать функцию javascript, которая могла бы пинговать сервер каждые 10 минут через что-то вроде

setTimeout("Ping()", 60000); 

Если вы хотите переместить пользователя на страницу входа в систему, если он соединяется с ошибочным сеансом, тогда я сначала проверил бы сеанс, и в случае неудачи отправил

header("Location: ...");

http://ca2.php.net/manual/en/function.header.php

0 голосов
/ 17 июня 2009

Вы структурируете код Javascript, который заставляет Ajax-запрос принимать специальный результат (скажем, -1, где обычно >=0 число, например, количество голосов), что означает «извините, буб, вы» re timed out »и перенаправить на страницу повторного входа в систему (которая может принимать в качестве необязательного параметра сообщение, объясняющее пользователю, для которого истекло время ожидания, & c).

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