У меня есть две веб-страницы 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());
}
}
Я ожидал AJAX вызова для сброса счетчика. Попробуем решение jQuery. Благодарю. – Praneeth