gpt4 book ai didi

java - 如果浏览器关闭,JSF session 过期阶段监听器

转载 作者:行者123 更新时间:2023-11-30 04:42:57 26 4
gpt4 key购买 nike

如果用户关闭浏览器并离开,我想在 session 超时时进行记录。例如,作为系统引起的注销而不是用户请求(我已经有工作和测试的代码来记录用户请求的注销)。

由于用户没有主动提交请求(特别是如果这只是服务器上现在未使用的 session 超时的问题),我认为不可能使用过滤器。这可以通过相位监听器来完成吗?如果是这样,您可以提供一些见解或框架,或者至少为我指出如何完成此操作的正确方向。

我的理解是,服务器上的 session 仍然处于 Activity 状态,直到超时或某些其他机制使其无效。因此,我假设阶段监听器还能够判断作为登录方法的一部分,您是否在用户使用新 View 、其他计算机等再次登录之前终止任何现有 session 。

我对研究没问题,但至少想在指向正确的方向时开始。 :)

第二点:是否可以区分 session 超时和 View 过期?

<小时/>

我想我会根据建议发布我最终得到的解决方案:

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 并使用 sessionDestroyed 方法来记录 session 超时事件。

并在web.xml中将其注册为

<listener>
<listener-class>
com.ourpackage.OurHttpSessionListener
</listener-class>
</listener>

关于java - 如果浏览器关闭,JSF session 过期阶段监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11818250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com