Как бороться с таймаутами сеанса в запросах AJAX

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

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

Ответы

Ответ 1

Рассмотрим вопрос о возврате статуса 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.

Ответ 2

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

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

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

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

Ответ 3

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

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

<!--LOGINFORM-->

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

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

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

Ответ 4

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

Ответ 5

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

setTimeout("Ping()", 60000); 

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

header("Location: ...");

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

Ответ 6

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

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