Автоматический выход из системы по истечении сеанса

StackOverflow https://stackoverflow.com/questions/3201991

  •  12-09-2020
  •  | 
  •  

Вопрос

Наше приложение выходит из системы через 30 минут и перенаправляется на страницу входа в систему. Я указываю тайм-аут сеанса в web.xml и использую процессор запроса для перенаправления. Я хочу показать пользователю сообщение о том, что срок действия вашего сеанса истек по истечении срока действия сеанса, как Могу ли я это сделать? Автоматический выход из системы?Я хотел бы вывести сообщение об ошибке на странице «Сеанс истек, пожалуйста, войдите снова».Тогда как я могу определить, что сеанс истек?будут ли какие-либо методы запускаться автоматически?

Это было полезно?

Решение

Создайте средство проверки активности, которое каждую минуту проверяет, имела ли место какая-либо активность пользователя (щелчок мышью, нажатие клавиши), и отправляет контрольный сигнал серверной стороне, чтобы поддерживать сеанс активным, когда пользователь активен, и ничего не делает, когда пользователь неактивен.Если нет активности в течение 30 минут (или в зависимости от того, какое время ожидания сеанса по умолчанию установлено на стороне сервера), выполните перенаправление.

Вот начальный пример с небольшой помощью jQuery для привязки событий щелчка и нажатия клавиш и запуска запроса ajax.

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
    $(document).ready(function() {
        $.active = false;
        $('body').bind('click keypress', function() { $.active = true; });
        checkActivity(1800000, 60000, 0); // timeout = 30 minutes, interval = 1 minute.
    });

    function checkActivity(timeout, interval, elapsed) {
        if ($.active) {
            elapsed = 0;
            $.active = false;
            $.get('heartbeat');
        }
        if (elapsed < timeout) {
            elapsed += interval;
            setTimeout(function() {
                checkActivity(timeout, interval, elapsed);
            }, interval);
        } else {
            window.location = 'http://example.com/expired'; // Redirect to "session expired" page.
        }
    }
</script>

Создать Servlet который слушает /heartbeat и делает в основном следующее:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    request.getSession();
}

чтобы сохранить сеанс живым.

Когда вы сохраняете вошедшего в систему пользователя в сеансе, он будет «автоматически» выходить из системы по истечении срока действия сеанса.Таким образом, вам не нужно вручную выходить из системы.

Другие советы

Создайте реализацию класса Listener HttpSessionListener и определите его в web.xml

Это уведомит вас, когда какой-либо сеанс будет уничтожен.Использовать sessionDestroyed() метод.

Полный пример смотрите здесь:

http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/

Либо это может быть простой сервлет, Spring-MVC или Spring-Security Auto Logout без идеальной логики клиента.

Учитывая приложение будет иметь оба типа запроса

    .
  • ajax и
  • Представление формы / Страница перезагрузить

Авто Авто требуется очень рассчитанная логика. Представляя мою реализацию функциональности Autologout с помощью следующих действий

Преимущества.


1. Дополнительный вызов / запрос не используется для этого. Учитывая влияние на производительность, если более 10 тысяч активных пользователей и дополнительных вызовов для достижения автоматической выхода.
2. Одна конфигурация строки с использованием тега.
3. Работает безупречно, даже если пользователь открывает несколько вкладки или несколько окна.

4. Он забивает вас до 30 секунд недействительной сессии, поэтому, если вы заполнили форму и не отправляли, вы можете сохранить заседание в живых (расширить сеанс одним щелчком мыши). Так что пользователю менее вероятно, чтобы потерять несогласованные данные.

Использование


1. Включите автоматический сценарий выхода в систему в необходимых страницах JSP, как указано ниже.

    ....
    </body>
    <jsp:include page="../template/autologout-script.jsp"></jsp:include>
</html>
.

2. Создайте страницу JSP, Autologute-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. Настройте атрибуты сеанса для настройки настройки тайм-аута Примечание. Настройте это после создания сеанса. Вы можете реализовать метод сеанса HTTPSISELISTENER и установить следующую конфигурацию согласно вашему требованию.

session.setMaxInactiveInterval(300);

session.setAttribute("timeOutTimeInSeconds", 300);
session.setAttribute("showTimerTimeInSeconds", 30);

.

4. Добавьте ниже HTML для отображения таймера.

Примечание. Он может быть перемещен на страницу шаблона Autologout-Script, если вы хороши в 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>
     &nbsp; 
     <small>Refresh</small>
     <i class="glyphicon glyphicon-refresh"></i>
</span>
.

 Введите описание изображения здесь

Это все о простой реализации автоматической выхода из системы. Вы можете скачать рабочий пример с моего репозитория GitHub Autologout с использованием простого примера сервлета Autologout Использование Пример конфигурации Java Security Security
Autologout Использование примера конфигурации XML Security Security

Логика объяснила


CASE 1: на странице Загрузка


Здесь логика проста, на странице загрузки набор таймера интервалов Equlas на MaxInactiveNiderval. После перенаправления тайм-аута для входа в систему.
CASE 2: Держите трек AJAX CONSTOR


Теперь, учитывая запросы AJAX, вы можете использовать .ajaxstart () или .ajaxcomplete () обратных вызовов jQuery, чтобы при запуске запроса Ajax вы можете сбросить интервал.
CASE 3: Отслеживание мульти вкладка / Оконная активность


Intertab Communication осуществляется для синхронизации состояния каждой вкладки. Используется LocalStorage на событие изменить.

Ограничения / Улучшения требуются

1. Если максимально допустимая сессия - это один, если сеанс взята из другой системы, запрос AJAX не удастся. Он должен быть обработан для перенаправления на страницу входа.
2. Используйте AjaxStart () вместо AjaxComplete (), чтобы иметь точную синхронизацию значений FARLELIME между сервером и браузером.

Требования

1. jquery

Альтернативы текущей реализации сравнивают


1. Настройка заголовка обновления в ответ HTTP. (не работает для запросов AJAX)

response.setHeader("Refresh", "60; URL=login.jsp");
.

  1. Настройка мети обновить тег в HTML (не работает для запросов AJAX)
  2. <meta http-equiv="refresh" content="60; url=login.jsp">
    
    .
    1. Настройка проверки активности Сохраняет сеанс в живых путем повторного запроса AJAX. Отслеживает время простоя и запрашивает запрос выхода после тайм-аута.

      Без сомнения, это хороший с простой логикой. Но я хочу просто чернила мои наблюдения.
        .
      • влияние на производительность Если 2 запроса сделаны в минуту, чтобы сохранить сессию в живых и 50k активных пользователей. 100К запросы в минуту.
      • Intertab Communication Если две вкладки открыты, одна вкладка предпринимает активность, но другая вкладка не принимает активность, вкладка запрашивает запрос выхода из системы и неверный сеанс, даже если действие присутствует на другой вкладке. (Но можно обрабатывать)
      • force logout подход Это клиент доминирует над сервером для недействительной сессии.

Если вы используете Servlet Sessions, вы можете проверить, возвращается ли сеанс JSP / Servlet, новая с использованием метода iSnew ().Если да, то сеанс пользователя истек истек, и вы можете отобразить соответствующие сообщения.

Включите функцию утилиты JavaScript внутри вашего JSP и пинг сервер каждые 31 минуты. Вышеуказанная функция утилиты должна использоваться функцию Setimeate () JS внутри.

setTimeout ( "checkServerSession()",  /* intervalInMilliSeconds */ 31000);
.

Обратите внимание, что

Checkserversession ()

- это обычная функция JS, которая может пожарить HTTP-запросы.Если запрос является успешным сеансом, существует иначе показать запрос пользователя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top