2013-08-01 2 views
0

У меня есть две веб-страницы index.xhtml и sessionExpiry.xhtml. Цель заключается в перенаправлении пользователя на страницу sessionExpiry.xhtml с таймаутом. Я сделал тайм-аут сеанса 1 минута в web.xml. Я использую тэг http-equiv=refresh для перенаправления пользователя с таймаутом. index.xhtml имеет обязательное текстовое поле, которое отображает сообщение об ошибке после onblur event, если ничего не введено. Добавлен HttpSessionListener для записи создания и уничтожения сеанса.JSF Ajax событие не распространяется session.maxInactiveInterval

Сценарий тестирования: Открыть веб-страницу в браузере, время создания сеанса, отображаемое в журналах сервера, через 15 секунд, щелкнуть по текстовому полю ввода и щелкнуть по внешней стороне и отобразить сообщение с большой ошибкой. Оставив веб-страницу бездействующей, веб-страница перенаправляет на sessionExpiry.xhtml через 1 мин (я ожидал, что это произойдет через 1 мин 15 секунд), но сообщение об уничтожении сеанса в журналах сервера происходит примерно через 2-3 минуты.

Почему сеанс разрушен с задержкой? Как я могу сделать истечение сеанса после 1 минуты бездействия после события AJAX? Ниже приведен исходный код.

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
<context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
</context-param> 
<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 
<session-config> 
    <session-timeout> 
     1 
    </session-timeout> 
</session-config> 
<listener> 
    <listener-class>com.sessiontimeout.HttpSessionChecker</listener-class> 
</listener> 
<welcome-file-list> 
    <welcome-file>index.xhtml</welcome-file> 
</welcome-file-list> 

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:rich="http://richfaces.org/rich"> 
    <h:head> 
     <title>Facelet Title</title> 
     <meta http-equiv="refresh" content="#{session.maxInactiveInterval};url=./sessionExpiry.xhtml" /> 
    </h:head> 
    <h:body> 
     <h:form> 
      Hello from Facelets 
      <h:panelGrid columns="3"> 
       Enter some text: 
       <h:inputText id="txt" required="true" maxlength="16" size="20" 
          autocomplete="off" requiredMessage="Text is Required"> 
        <f:ajax event="blur" render="txtmsg" /> 
       </h:inputText> 
       <rich:message id="txtmsg" for="txt" /> 
      </h:panelGrid> 
     </h:form> 
    </h:body> 
</html> 

sessionExpiry.xhtml

<h:body> 
     Session Timed out after ${session.maxInactiveInterval/60} minutes of inactivity. 
</h:body> 

HttpSessionChecker.java

public class HttpSessionChecker implements HttpSessionListener { 

    public void sessionCreated(HttpSessionEvent event) { 
     System.out.println("Session ID " + event.getSession().getId() + " created at " + new Date()); 
    } 

    public void sessionDestroyed(HttpSessionEvent event) { 
     System.out.println("Session ID " + event.getSession().getId() + " destroyed at " + new Date()); 
    } 

} 

ответ

0

Я ожидал, что это произойдет через 1 мин 15 сек

Вы можете установить время ожидания на одну минуту, так что тайм-аут после одной минуты. Вам нужно было сделать синхронную обратную передачу, чтобы обновить этот мета-элемент или обновить этот элемент через JS при успешном вызове ajax, и это будет возможно продлить мероприятие (см. Is it possible to use javascript to change the meta-tags of the page?).

Сеанс уничтожил сообщение на логах сервера происходит вокруг 2-3 минут

Там нет ограничений на , когда именно сессия будет аннулирована контейнером после тайм-аута события (см recognizing session timeout). Контракт говорит, что он будет признан недействительным в определенное время, но не точно, когда он истечет, и он не будет считаться активным. Для мгновенного аннулирования вместо этого применяется подход invalidate-and-send-redirect (см. JSF logout using session.invalidate does not clear the current username?).

Почему сеанс разрушен с задержкой? Как я могу сделать истечение сеанса после 1 минуты бездействия после события AJAX?

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

  1. How to handle session expiration and ViewExpiredException in JSF 2?
  2. javax.faces.application.ViewExpiredException: View could not be restored
  3. Session timeout and ViewExpiredException handling on JSF/PrimeFaces ajax request
+0

Я ожидал AJAX вызова для сброса счетчика. Попробуем решение jQuery. Благодарю. – Praneeth

Смежные вопросы