Обоснование и исследование
У меня есть сайт, который требует от пользователей входа в систему для просмотра. Пока пользователи вошли в систему, я хотел бы следить за их сеансом пользователя. Под этим я подразумеваю, что хотел бы знать, истек ли срок их пользовательского сеанса, и, следовательно, перенаправить их.
Сеанс каждого пользователя длится 1 час (или что-то другое, на что я его настроил) и сбрасывается, если они посещают другую страницу (как и большинство систем входа).
На данный момент у меня следующий алгоритм:
- Пользователь попадает на приватную страницу (выполняется метод javascript с именем
isUserAuthorized()
) - Метод
isUserAuthorized()
javascript отправляет запрос AJAX на страницу ajax.example.net/authorized. - Эта страница возвращает объект JSON, указывающий текущий статус пользователя, например:
{ authorized: true, timeout: 3600000 }
- Затем метод javascript устанавливает тайм-аут для повторного вызова метода в
timeout
миллисекундах, предполагая, что сеанс завершится к этому времени. - Если сеанс завершился, перенаправьте пользователя, в противном случае вызовите метод через
timeout
миллисекунд.
Есть две причины, по которым мне не нравится этот текущий метод:
- У меня были проблемы с синхронизацией времени между часами клиента и сервера, это странно, но определенно вызывает проблему...
- Он оставляет тайм-аут в фоновом режиме веб-страницы, и, поскольку этот сайт очень загружен javascript, я бы предпочел не иметь этого дополнительного тайм-аута, чтобы сайт оставался максимально плавным.
Мой вопрос
Поэтому мой вопрос: может ли кто-нибудь придумать лучший способ добиться этого? Я думал о длинных опросах или веб-сокетах, но я не уверен на 100%, как использовать любой из них, и учебные пособия по веб-сокетам, которые я нашел, были не очень хорошими! Будут ли они на самом деле лучшим решением?
Я мог бы обойти проблемы с синхронизацией времени, но прежде чем я это сделаю, я хочу убедиться, что нет лучших способов добиться этого...
Если это поможет, вот мой текущий код:
// Set the Authorized Timeout
MN.authorizedTimeout = setTimeout(function(){MN.isUserAuthorized});
/**
* Is User Authorized
* Checks to see if the current user is authorized and
* makes sure their session is still active
*/
MN.isUserAuthorized = isUserAuthorized;
function isUserAuthorized(){
// TEMPORARY
console.log('authorising');
// Set the authorized var
var authorized = false;
// Clear the current timeout
clearTimeout(MN.authorizedTimeout);
// Send request to determine whether the user is authorized
$.ajax({
url: "//ajax.example.net/authorized",
type: "GET",
dataType: "JSON",
cache: false,
async: false,
success: function(data){
console.log(data);
if(data.authorized){
// If the user is authorized then check again in timeout milliseconds
MN.authorizedTimeout = setTimeout(MN.isUserAuthorized,data.timeout_milliseconds);
// Set authorized to true
authorized = true;
}else{
// If the session has expired then proceed to informing the user
MN.userSessionExpired();
// Set authorized to false
authorized = false;
}
}
});
// Return the session status boolean
return authorized;
}