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

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

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

Solutions Collecting From Web of "Как бороться с таймаутами сеанса в запросах AJAX"

Подумайте о возврате статуса http 401 и объекта JSON, подробно описывающего причину. Если вы используете jQuery, это приведет к error() вызову 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.

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

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

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

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

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

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

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

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

 setTimeout("Ping()", 60000); 

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

 header("Location: ..."); 

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

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

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