我有一个JSF Web客户端和一个Java客户端,它们的应用程序逻辑都使用相同的无状态EJB层。我不确定如何平衡性能需求(限制表示层和应用层之间传输的数据量)与安全性(从确保所有决策基于最新数据的角度来看)之间的平衡。无状态EJB:在性能和安全性之间找到平衡点
我明白,这是一个主观题,所以也许我可以使其更客观结合具体实例:
- 不要只送上我的用户名到EJB的,然后加载到每个用户的实体,每个EJB调用,还是我从表示层发送用户实体?
- 如果我需要更多的信息,而不仅仅是用户实体(假设我需要在每个EJB调用中加载一个额外的实体),我会发送用户名和其他实体的密钥并加载应用层中的两个实体,或者我是否从表示层发送两个实体?
- 如果我需要更多关于某些EJB调用(> = 3个实体)的更多信息,那么怎么办?
什么时候发送实际的实体而不是只发送它的密钥,或者永远不会回答,总是重新加载到应用层?我应该担心表现吗?我听说Hibernate(我正在使用)使用智能缓存,这意味着用户实体可能不会每次都从数据库重新加载?如果我的EJB方法的粒度非常小,并且前端操作有时可能会导致调用3个或更多的EJB方法,那么每个EJB方法都需要加载用户实体呢?
最后的相关问题:我打算使用JAAS主体来存储由EJB加载的用户名。如果我的远程外观EJB调用一堆也需要用户信息的本地无状态EJB,那么我仍然使用JAAS主体并在它们中的每一个中加载用户实体,或者有更好的方法吗?
我同意没有客户给我任何实体信息,但我担心表现。我想使用JAAS,所以我可以检索经过身份验证的主体,我不知道如何在EJB端检索用户名(如果我只是将它作为参数传递,我如何确保客户端通过该用户名进行身份验证并不只是构建它)?另外,你是否建议我将我的用户实体传递给所有非门面会话bean,还是应该独立执行并从用户名加载实体? – Zecrates 2009-09-16 08:30:12
直到您知道这是一个问题时才需要担心性能。通过Hibernate加载一个轻量级的用户对象不会导致性能问题,所以如果这是一个问题,我会走这条路并稍后调整。 我明白了,你正在使用容器认证,这就是为什么JAAS在玩的原因。这本身似乎是您自己管理身份验证的一个很好的选择。 我会有每个对象加载用户根据需要。序列化一个Hibernate管理的用户对象可能不像你想象的那样工作,或者至少强迫Hibernate完全实例化这个对象,这并不酷。 – 2009-09-16 12:38:43