Поддерживать сеанс в течение неопределенного времени - PullRequest
4 голосов
/ 09 января 2012

Есть ли способ сохранить сеанс страницы активным, не прибегая к отправке состояния клиенту? Я не могу установить STATE_SAVING_METHOD на client и предпочел бы не использовать a4j:keepalive.

Я пытался использовать простой скрытый iframe, который отправляет компоненту, о котором идет речь, но он делает недействительной главную страницу.

Я использую JSF 1.2 и myfaces.

Это позволяет обойти исключение ViewExpiredException на странице, на которой пользователю не требуется входить в систему. Большинство существующих сайтов требует, чтобы пользователь вошел в систему.

Ответы [ 2 ]

12 голосов
/ 09 января 2012

Реализовать опрос ajax как «сердцебиение», чтобы поддержать сеанс. В простейшем случае вы можете добиться этого следующим образом с помощью небольшого jQuery , чтобы избежать шаблонного кода из 100 строк, чтобы заставить его работать во всех различных браузерах, о которых знает мир:

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
    $(document).ready(function() {
        setInterval(function() {
            $.get("${pageContext.request.contextPath}/poll");
        }, ${(pageContext.session.maxInactiveInterval - 10) * 1000});
    });
</script>

${pageContext.session.maxInactiveInterval} печатает оставшиеся секунды сеанса еще в соответствии с конфигурацией на стороне сервера (которая, кстати, управляется <session-timeout> в web.xml) и вычитается с помощью 10 секунд, чтобы успеть до истечения срока его действия и преобразовать в миллисекунды так, чтобы он соответствовал ожиданиям setInterval().

$.get() отправляет ajax GET-запрос на указанный URL-адрес. В приведенном выше примере вам необходимо сопоставить сервлет с шаблоном URL-адреса /poll, а в методе doGet() в основном выполняется следующее:

request.getSession(); // Keep session alive.

Так и должно быть.

5 голосов
/ 21 октября 2013

Ответ BalusC помог мне выполнить это требование в моем приложении, но, поскольку я использую PrimeFaces, я хотел поделиться тем, как ответ BalusC вдохновил код, который я использую для этого.

xhtml page

<p:poll listener="#{pf_usersController.keepUserSessionAlive()}"
        interval="#{session.maxInactiveInterval - 10}" />

фасоль

public void keepUserSessionAlive() {
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
    request.getSession();
}

как всегда, спасибо, BalusC!

РЕДАКТИРОВАТЬ: Enduser проверил это сегодня утром, и он отлично работает! мое приложение обычно устанавливает тайм-аут сеанса через 15 минут после полного обновления страницы (перенаправьте в файл sessionExpired.xhtml с помощью мета-обновления на основе session.maxInactiveInterval и значения времени ожидания сеанса в web.xml); если пользователь на одной странице выполняет несколько запросов AJAX, время сеанса истечет, так как AJAX! = полное обновление страницы, но этот код позволил конечному пользователю «поддерживать сеанс», пока он находился на странице расчета в приложении, а сеанс оставался живым от 1 до 2 часов! :)

...