2016-04-28 63 views
0

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

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

回答

3

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

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

+0

以前我一直在按照你说的去做,在每个页面加载(或请求)上设置cookie。我在一个多页面的应用程序工作。每个页面都有自己的ID。一个页面在注销时重定向到登录页面。在每个ViewScoped页面上登陆后,我一直在用'PostConstruct'方法中的一个名为'lastOpenedId'的键设置cookie。此ID来自会话范围的服务bean。但是我不得不改变它,因为我的实际需求是存储'lastExpiredId',而不是由于会话超时而必须跟踪登出的页面的id。 – user2918640

+1

将其存储在数据库中。 – BalusC

+0

这就是我一直在想的最后一招,除非我能想出一些可以在网页框架层面完成的事情。 – user2918640