Либо это может быть простой сервлет, spring-mvc или spring-security, автоматический выход из системы невозможен без совершенной логики на стороне клиента.
Учитывая, что приложение будет иметь оба типа запроса
- AJAX и
- отправка формы/перезагрузка страницы
Автоматический выход требует очень просчитанной логики. Представляя мою реализацию функции автоматического выхода из системы следующим образом
Преимущества.
1. Для этого не используется дополнительный вызов/запрос. учитывая влияние на производительность, если более 10 000 активных пользователей и дополнительные вызовы для автоматического выхода из системы.
2. Однострочная конфигурация с использованием тега.
3. Работает безупречно, даже если пользователь открывает несколько вкладок или несколько окон.
4. Он уведомляет вас до 30 секунд об аннулировании сеанса, поэтому, если вы заполнили форму и не отправили ее, вы можете сохранить сеанс (продлить сеанс одним щелчком мыши). Таким образом, у пользователя меньше шансов потерять несохраненные данные.
использование
<сильный>1. Включите сценарий автоматического выхода из системы на необходимые страницы JSP, как показано ниже.
....
</body>
<jsp:include page="../template/autologout-script.jsp"></jsp:include>
</html>
<сильный>2. Создайте страницу JSP, autologout-script.jsp и добавьте приведенный ниже код. Примечание. Редактировать/настраивать не требуется.
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<script>
$(document).ready(function()
{
var timeOutTimeInSeconds = ${ timeOutTimeInSeconds };
var showTimerTimeInSeconds= ${ showTimerTimeInSeconds };
var sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);
var timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);
var badgeTimerId;
window.localStorage.setItem("AjaxRequestFired", new Date());
function redirectToLoginPage(){
//location.href = '<c:url value="/" />'+'${loginPageUrl}';
window.location.reload();
}
$(document).ajaxComplete(function () {
resetTimer();
});
$(window).bind('storage', function (e) {
if(e.originalEvent.key == "AjaxRequestFired"){
console.log("Request sent from another tab, hence resetting timer")
resetTimer();
}
});
function resetTimer()
{
showTimerTimeInSeconds= ${ showTimerTimeInSeconds };
console.log("timeOutTimeInSeconds : "+timeOutTimeInSeconds)
window.localStorage.setItem("AjaxRequestFired", new Date());
window.clearInterval(sessionCheckIntervalId);
sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);
window.clearInterval(timerDisplayIntervalId);
timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);
hideTimer();
}
function showTimer()
{
$('#sessionTimeRemaining').show();
$('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
window.clearInterval(timerDisplayIntervalId);
badgeTimerId = setInterval(function(){
$('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
}, 1000);
}
function hideTimer()
{
window.clearInterval(badgeTimerId);
$('#sessionTimeRemaining').hide();
}
});
</script>
<сильный>3. Настройте атрибуты сеанса для настройки времени ожидания. Примечание. Настройте это после создания сеанса. Вы можете реализовать метод HttpSessionListener sessionCreated и установить следующую конфигурацию в соответствии с вашими требованиями.
session.setMaxInactiveInterval(300);
session.setAttribute("timeOutTimeInSeconds", 300);
session.setAttribute("showTimerTimeInSeconds", 30);
<сильный>4. Добавьте ниже html для отображения таймера.
Примечание: его можно переместить на страницу шаблона сценария автоматического выхода из системы, если вы хорошо разбираетесь в CSS. Следовательно, вы можете не добавлять это на каждую страницу.
Включите загрузку или добавьте свой собственный CSS.
<span class="badge badge-primary" title="click to keep session alive" id="sessionTimeRemaining"
onclick="ajaxSessionRefresh()" style="display:none;">
<i class="badge badge-danger" id="sessionTimeRemainingBadge" style="float:left">30</i>
<small>Refresh</small>
<i class="glyphicon glyphicon-refresh"></i>
</span>
![введите здесь описание изображения](https://i.stack.imgur.com/Tb8Ui.png)
Это все о простой реализации автоматического выхода из системы. Вы можете загрузить рабочий пример из моего репозитория github
автоматический выход с помощью простой пример сервлета
Автоматический выход с использованием Пример конфигурации Java Spring-Security
Автоматический выход с использованием примера конфигурации spring-security xml
Объяснение логики
Случай 1: при загрузке страницыЗдесь логика проста, при загрузке страницы установите таймер интервала, равный maxInactiveInterval. после тайм-аута перенаправить на страницу входа.
Случай 2: отслеживать вызовы AJAXТеперь, учитывая запросы AJAX, вы можете использовать обратные вызовы .ajaxStart() или .ajaxComplete() jquery, чтобы, если любой ajax-запрос запущен, вы можете сбросить интервал.
Случай 3: отслеживание активности нескольких вкладок/окнаСвязь между вкладками выполняется для синхронизации состояния каждой вкладки. Используется localStorage при изменении события.
Необходимые ограничения/улучшения
1. Если максимально разрешенный сеанс равен одному, если сеанс взят из другой системы, запрос AJAX завершится ошибкой. Его необходимо обработать для перенаправления на страницу входа.
2. Используйте ajaxStart() вместо ajaxComplete() для точной синхронизации значений idleTime между сервером и браузером.
Требования
1. JQuery
Сравнение альтернатив текущей реализации
1.
Настройка заголовка обновления в ответе http.
(Не работает для запросов AJAX)
response.setHeader("Refresh", "60; URL=login.jsp");
- Настройка метатега обновления в HTML (не работает для запросов AJAX)
<meta http-equiv="refresh" content="60; url=login.jsp">
- Configuring Activity checker
Keeps session alive by repeated AJAX request. Tracks idle time and makes logout request after timeout.
No doubt it is a good one with simple logic. But i want to just ink my observations.
- Performance impact if 2 requests are made per minute to keep session alive and 50k active users. 100k requests per minute.
- Взаимодействие между вкладками Если открыты две вкладки, одна вкладка получает активность, а другая вкладка не получает активности, эта вкладка запускает запрос на выход из системы и делает сеанс недействительным, даже если активность присутствует на другой вкладке. (Но можно справиться)
- Принудительный выход из системы. Клиент доминирует над сервером, чтобы сделать сеанс недействительным.
person
PraveenKumar Lalasangi
schedule
25.08.2019