【问题标题】:How to use data saved from an old session in next session?如何在下一个会话中使用从旧会话中保存的数据?
【发布时间】:2016-08-22 19:15:31
【问题描述】:

我一直在使用 cookie 跨会话共享非敏感数据。我想在用户注销事件时从当前会话中存储一些 lastUsedEntity (字符串文字),以便可以在下一次登录会话中读取/使用该实体。所述实体属于我的应用程序的会话 bean。

我决定在会话 bean 的@PreDestroy 方法中提取并存储这个实体。该方法在应用程序的会话超时时成功运行。但是存储cookie失败,因为FacesContext.getCurrentInstance()@PreDestroy方法中为null,可能是因为JSF生命周期请求-响应周期到那时完成。我尝试在我的会话 bean 的 @PostContruct 方法中缓存 FacesContext.getCurrentInstance(),以便我可以访问面部上下文缓存的实例,但后来我遇到了另一个问题 java.lang.IllegalStateException at com.sun.faces.context.FacesContextImpl.assertNotReleased,因为我使用 FacesContext 作为会话范围类的实例变量。如果我能在这里提出一些建议或任何其他更好的想法,以便保留我的旧会话数据以供在这种情况下进一步使用,我将不胜感激。

【问题讨论】:

    标签: session jsf-2


    【解决方案1】:

    当 HTTP 会话由于最终用户不活动而在服务器端过期时,不一定意味着 HTTP 请求。最终用户本身是唯一可以发送 HTTP 请求的人。如果没有调用FacesServlet 的HTTP 请求,那么也没有FacesContext。更不用说可以返回 cookie 的 HTTP 响应了。

    你最好重新考虑你的逻辑。例如。立即在每个请求上设置 cookie,覆盖前一个请求,如有必要,在特定路径上和/或在 cookie 值中使用时间戳。根据具体的功能要求,可能会有更好的方法,因为 cookie 完全可以由最终用户操作,您绝对不应该依赖关键业务逻辑。如果纯粹是为了演示,应该没问题,否则最好将其存储在与登录用户关联的数据库中。

    【讨论】:

    • 以前我一直按照你说的做,在每个页面加载(或请求)时设置cookie。我正在一个多页应用程序中工作。每个页面都有自己的 id。页面在注销时重定向到登录页面。在登陆每个ViewScoped 页面时,我一直在PostConstruct 方法中使用名为“lastOpenedId”的键设置cookie。此 id 来自会话范围的服务 bean。但我不得不更改它,因为我的实际要求是存储“lastExpiredId”,即我必须跟踪由于会话超时而注销的页面的 id。
    • 这是我一直在考虑的最后手段,除非我能想出可以在网络框架级别完成的事情。
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多