服务器端共享会话的场景是什么?是否有一些方法可以在 JAVA EE 平台的服务器端共享会话?
2 回答
在 Java EE 上,您必须查看 Servlet 规范,对象 HttpSession 提供了在服务器端管理会话的行为。
http://docs.oracle.com/javaee/5/tutorial/doc/bnagm.html
尽管您可以在会话中存储任何对象,但这种做法可能很危险,因为对象会一直保留在会话中,直到会话过期或对象被删除,因此如果您的程序不能很好地管理存储在会话中的对象,您可以使用到许多堆内存。
session的对象在过期时被删除,过期时间在部署描述符web.xml中配置,也可以由客户端设置。如果您未指定会话到期时间,则默认值为 30 分钟,这 30 分钟从用户发出的最后一次请求开始计算。
我的建议是不要在会话中存储对象,必须使用对象 HttpServletRequest 以及方法 setAttribute 和 getAttribute 在请求之间传递对象。我需要在会话中存储一个值,您可以存储产品的 ID 而不是整个产品。会话的一个常见用途是存储变量,这些变量必须超过一个请求,并且出于安全原因您不想将其存储在 cockles 上。
由于问题没有明确说明需要在哪个会话之间共享对象,我可以建议以下选项:
1)如果您需要在同一服务器(tomcat)上的不同Web应用程序之间共享会话,您可以使用:
<Host name="localhost" ...>
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
</Host>
2)如果服务器不是tomcat,请参考相应服务器的SSO选项。
3) 您也可以使用成熟的 SSO 产品,例如 CAS ( http://www.jasig.org/cas ),它允许您跨不同服务器的应用程序共享会话,但不能在用户之间共享会话。
4)如果您需要在不同用户之间共享会话,您需要做的就是根据您的共享标准在不同客户端(通常是浏览器)之间传递会话 ID,例如玩相同游戏的人,访问相同的公告板并可以协作更改数据。但是,请理解大多数安全基础设施都是围绕会话 ID 的映射构建的。如果您选择让会话 id 在多个用户之间显式访问,您将不得不自己重新创建许多安全过滤器。
5)或者,最好的方法是管理对象的状态与会话不同。共享对象的状态可以以更符合标准的安全和可审计的方式在多个会话中共享。