Метаобновление на session.maxInactiveInterval и AJAX не ладят

У меня есть веб-страница JSF с использованием PrimeFaces 5.1, и я хочу перенаправить перенаправление на некоторую страницу xhtml после истечения срока действия сеанса.

Я установил тайм-аут сеанса на 1 минуту (для тестирования после этого он будет установлен на 30) в web.xml

<session-config>
    <session-timeout>1</session-timeout>
</session-config>

И я добавил

<meta http-equiv="refresh" content="#{session.maxInactiveInterval};url=#{request.contextPath}/season_expired.xhtml"/>

на <h:head> шаблона по умолчанию, который используется на каждой странице приложения.

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

Есть ли способ «обновить» сеанс с помощью AJAX?


person Kiki    schedule 20.08.2015    source источник


Ответы (1)


Вы можете использовать JS setTimeout() для того, что вы можете очистить с помощью clearTimeout() при выполнении запроса ajax. Чтобы зарегистрировать глобальную функцию прослушивания событий ajax.

<script>
    var redirectToExpired = function() { window.location='#{request.contextPath}/expired.xhtml' };
    var expireTimeMillis = 5000;
    
    window.redirectOnExpire = setTimeout(redirectToExpired, expireTimeMillis);
    jsf.ajax.addOnEvent(function(data) {
        if (data.status == 'begin') {
            clearTimeout(window.redirectOnExpire);
            window.redirectOnExpire = setTimeout(redirectToExpired, expireTimeMillis);
        }
    });
</script>

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

Лучше просто не делать этого всего, а полагаться на ViewExpiredException во время реального действия пользователя. Вы можете найти в javax.faces.application. ViewExpiredException: View не может быть восстановлен, как зарегистрировать для этого страницу с ошибкой, а также как там можно использовать заголовок метаобновления.

Смотрите также:

person BalusC    schedule 20.08.2015