Автоматическое перенаправление JSP после истечения срока действия/тайм-аута сеанса

Есть ли способ определить время ожидания сеанса без (взаимодействия с пользователем) * и перенаправить его на какую-то страницу; т. е. если нет активности на странице @ определенной продолжительности; сервер обнаруживает его и автоматически перенаправляет на какой-то другой.

Под пользовательским взаимодействием я имею в виду; есть способ определить время ожидания сеанса, когда пользователь нажимает на что-то, затем какой-то запрос отправляется на сервер, а затем сервер проверяет, истек ли текущий сеанс пользователя или нет.

Что мне нужно здесь, так это то, что мы ничего не информируем сервер (или мы не выполняем никаких действий), но когда сеанс истекает, сервер автоматически обнаруживает это и выполняет требуемое действие.

Спасибо, Раза


person user473445    schedule 12.10.2010    source источник


Ответы (4)


Конечно, вы можете сделать это в JavaScript, реализовав прослушиватель клавиатуры и/или мыши для всего документа и периодический метод с тайм-аутом.

var timeOut = 1000 * 60 * 30; // 30 minutes
var lastActivity = new Date().getTime();
var checkTimeout;
checkTimeOut = function(){
    if(new Date().getTime() > lastActivity + timeOut){
        // redirect to timeout page
    }else{
        window.setTimeout(checkTimeOut, 1000); // check once per second
    }
}

теперь вашим глобальным слушателям просто нужно установить lastActivity на текущее время для каждого действия.

При повторном прочтении вопроса вы хотите использовать фактическое время ожидания сеанса с сервера приложений. Это сложный вопрос, потому что, когда вы отправляете ajax-запросы на сервер, вы фактически предотвращаете истечение срока действия сеанса (если нет жесткого ограничения), поэтому мой ответ может быть лучшим способом сделать это.

person Sean Patrick Floyd    schedule 12.10.2010
comment
Я использовал подобный метод в прошлом, и он работает хорошо. +1 - person cjstehno; 13.10.2010
comment
спасибо, мне действительно нужна была эта вещь, кстати, я также нашел связанную ссылку на том же сайте stackoverflow.com/questions/1985250/ - person user473445; 13.10.2010

Если требуется просто перенаправить на страницу входа (или любую другую страницу) после истечения времени сеанса, вот как я пытался это реализовать:

Включите следующий сценарий на ВСЕ страницы, требующие входа в систему.

<%
int timeout = session.getMaxInactiveInterval();
response.setHeader("Refresh", timeout + "; URL = login.jsp");
%>

Таким образом, любая страница, требующая входа в систему, будет обновляться/перенаправляться на login.jsp (изменив желаемый URL-адрес) после истечения времени сеанса.

ИЛИ (чтобы не пропустить страницы)

На самом деле вы можете записать его в отдельный файл (timedoutRedirect.jsp) и включить его в качестве заголовка на все страницы, для которых требуется вход в систему, используя «группу свойств JSP» (в web.xml)

<jsp-property-group>
        <display-name>all jsp</display-name>
        <url-pattern>/users/*</url-pattern>
        <include-prelude>/timedoutRedirect.jsp</include-prelude>           
</jsp-property-group>

(возможно, вам придется настроить URL-адрес прелюдии в соответствии со спецификациями вашего проекта)

person Jimmy Leo    schedule 17.09.2011

У меня была примерно такая же проблема, вот как я ее решил...

В основном я создал таймер сеанса на стороне клиента с помощью javascript. Я периодически отправляю вызов ajax (по таймеру, который меньше, чем фактическая настройка тайм-аута сервера), чтобы поддерживать сеанс на сервере.

Затем я создал еще один таймер, который ведет обратный отсчет на стороне клиента (установлен на то же время, что и фактическая настройка тайм-аута сервера). Если этот таймер истекает, то выполняется вызов ajax на сервер, который запускает session.invalidate(), а затем перенаправляется на страницу входа. Этот таймер сбрасывается каждый раз, когда происходит какое-то действие, которое должно поддерживать сеанс (например, щелчок мышью, нажатие клавиши и т. д.).

person malificent    schedule 05.05.2011

Либо это может быть простой сервлет, 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>
     &nbsp; 
     <small>Refresh</small>
     <i class="glyphicon glyphicon-refresh"></i>
</span>

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

Это все о простой реализации автоматического выхода из системы. Вы можете загрузить рабочий пример из моего репозитория 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");
  1. Настройка метатега обновления в HTML (не работает для запросов AJAX)
<meta http-equiv="refresh" content="60; url=login.jsp">
  1. 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