在用戶關閉瀏覽器並走開的情況下,我想在會話超時時記錄日誌。例如,作爲系統引起的註銷而不是用戶請求(我已經有工作和測試的代碼來記錄用戶請求的註銷)。如果瀏覽器關閉,JSF會話過期階段監聽器
由於用戶沒有主動提交請求(特別是如果它只是現在未使用的會話在服務器上超時的問題),我不認爲過濾器是可能的。這可以通過階段監聽器完成嗎?如果是的話,你能提供一些見解或骨架,或至少指出我如何做到這一點的正確方向。
我的理解是,服務器上的會話仍然是活動的,直到它超時或其他一些機制使其無效。因此,我假設階段偵聽器也將能夠告訴您是否作爲登錄方法的一部分,在用戶以全新視圖,其他機器等重新登錄之前終止任何現有會話。
我是確定研究,但至少要開始時指向正確的方向。 :)
在第二個注意:是否有可能區分會話超時和視圖過期?
想我會後我結束了基於該建議的解決方案:
public class ElsSoulardSessionListener implements HttpSessionListener {
@EJB
private SessionLogger sessionLogger = new SessionLogger();
private SessionLogDTO sessionData = new SessionLogDTO();
private ElsDateTimeFunctions ts = new ElsDateTimeFunctions();
private static final Logger logger = Logger.getLogger(ElsSoulardSessionListener.class.getSimpleName());
@Override
public void sessionCreated(HttpSessionEvent se) {
// Nothing to do yet
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
logger.log(Level.FINE, "SESSION DESTROYED LISTENER");
HttpSession session = se.getSession();
finalizeUserSessionLog(session);
}
/**
* Utility method to finalize user's session log entry. Returns
* early if the session log isn't found or more than one is returned.
* @param session
*/
private void finalizeUserSessionLog(HttpSession session) {
String sessionId = session.getId();
LogoutReasonType logoutReason = (LogoutReasonType) session.getAttribute("logoutreason");
if (logoutReason == null) {
logoutReason = LogoutReasonType.SESSION_TIMEOUT;
}
try {
sessionData = sessionLogger.findBySessionId(sessionId);
} catch (NonexistentEntityException | UnexpectedResultSetSizeException ex) {
logger.log(Level.WARNING, " sessionDestroyed ", ex);
return;
}
Calendar now = ts.getUtcDateTimeAsCalendar();
sessionData.setLogoutTimestamp(now);
sessionData.setLogoutReason(logoutReason);
sessionLogger.update(sessionData);
}
}
您可以使用[HttpSessionListener](http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSessionListener.html )來處理會話更改。 – 2012-08-05 17:03:11