JSF - 对应用程序范围Bean的广泛读写

Jai*_*iro 2 jsf lotus-notes javabeans xpages

在我的XPages Web应用程序(Xpages基于JSF的Lotus Notes技术)中,我需要一个动态映射来存储会话ID和上次访问时间(以毫秒为单位).这是作为TreeMap应用程序范围的bean内部实现的.每个对应用程序的初始访问都将当前会话注册到此bean中的TreeMap.此映射仅允许有限数量的会话条目,并且未注册多余的会话.地图也会在旧会话条目中偶尔清除一次,以便可以注册新会话.我需要知道这是否是一个可接受的方法/使用应用程序bean.我知道我可以暂时将会话条目存储在外部数据库中(非Lotus注释),但我正在为之工作的公司不允许我这样做.这种方法会引发我潜在的问题吗?如果是的话,我还有另一种方式吗?

Tim*_*ony 5

这听起来像是对应用程序bean的完全有效使用,但我提供了两个建议.第一种是使用ConcurrentSkipListMap而不是TreeMap.前者是线程安全的,而后者则不是.在与较低范围交互时,线程安全通常并不重要,因为每个用户只能写入自己的会话,查看和请求范围,但所有用户都可以写入应用程序范围,因此可以想象可能会发生并发写入,特别是在用户负载很重的应用中.第二个建议是在应用程序bean中存储有关每个会话的大量信息时要小心谨慎.由于所有用户都可以访问bean,因此理论上可能会无意中向用户泄露有关用户的过多信息.如果你只是存储会话名称或ID以及上次访问时间,你会没事的.但是,如果您实际存储了指向每个用户会话范围的指针,则可能会意外地为用户缓存的数据提供一个窗口,而该窗口是其他用户无权访问的.我从来没有真正看到有人因此而被咬过,但在应用程序范围内存储任何特定于用户的信息时,请务必牢记这一点.