2009-06-17 2 views
13

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

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

ответ

11

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

Я дам вам $ 0, если вы можете сказать мне, как правильно вернуть 401 –

+0

В ASP.NET вы просто набор Response.StatusCode = 401; Не мог бы рассказать вам, как на PHP, хотя ... возможно, в один прекрасный день кто-то создаст веб-сайт, который позволит вам задавать вопросы по программированию ;-p – swilliams

+0

Я действительно пробовал это, и это заканчивается тем, что появляется окно проверки подлинности Http с просьбой ваше имя пользователя и пароль. Это не совсем функциональность, которую я ищу. –

0

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

1

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

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

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

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

+0

fyi, я только сохраняю идентификатор пользователя в сеансе –

+0

Просто убедился, что это было не совсем ясно: x –

0

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

setTimeout("Ping()", 60000); 

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

header("Location: ..."); 

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

0

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

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

1

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

В моих системах система перенаправляет пользователя в форму входа в систему в любое время, когда пытается получить доступ к странице, и сеанс имеет тайм-аут или недействителен. я добавил в верхней части входа образуют следующий 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); 
       } 
      }, 
     }); 
    } 
}; 
Смежные вопросы