java无状态EJB:在性能和安全性之间找到平衡点
我有一个JSFWeb客户端和一个Java客户端,它们的应用程序逻辑都使用相同的无状态EJB层。我不确定如何平衡性能需求(限制在表示层和应用层之间传输的数据量)和安全性(确保所有决策都基于最新数据)
我知道这是一个主观的话题,所以也许我可以用具体的例子使它更客观:
- 我是只向EJB发送用户名,然后在每次EJB调用上加载用户实体,还是从表示层发送用户实体李>
- 如果我需要的信息不仅仅是用户实体(假设我需要在每个EJB调用中加载一个额外的实体),那么我是发送用户名和另一个实体的密钥并在应用层中加载这两个实体,还是从表示层发送这两个实体李>
- 如果我需要关于某些EJB调用(>;=3个实体)的更多信息,该怎么办李>
什么时候发送实际实体而不仅仅是它的键才有意义,或者答案永远不会在应用层端重新加载?我应该担心表现吗?我听说Hibernate(我正在使用)使用智能缓存,这意味着用户实体可能不会每次都从数据库中重新加载?如果我的EJB方法粒度很小,前端操作有时可能会导致调用3个或更多EJB方法,而每个方法都需要加载用户实体,该怎么办
最后一个相关问题:我打算使用JAAS主体来存储EJB加载的用户名。如果我的远程facade ejb调用了一堆也需要用户信息的本地无状态ejb,那么我是否仍然使用JAAS主体并在每个ejb中加载用户实体,还是有更好的方法
# 1 楼答案
如果只创建一个EJB,那么创建无状态会话。就我个人而言,我发现它欺骗了空接口
# 2 楼答案
您应该考虑状态EJB,因为它听起来像客户端需要一个非平凡的状态来回答来自一个用户的关于同一状态的一系列请求。也就是说,有状态EJB是一种需要正确编写和配置的工具
作为设计问题,我不会让客户机将用户信息发送到业务逻辑层。第一,它只是把问题推给客户,不是吗?要加载、存储和发送此信息?此外,从安全角度来看,让一个可能不太安全的客户端层将敏感的用户数据提供给一个更安全的后端层,然后后端层信任并使用这些信息,也让我感到紧张
但是,真的,我认为你已经提到了最好的方法:Hibernate的延迟加载。您只需与对象交互,让它按需加载数据。在这方面,为了与Hibernate很好地配合,用户对象应该很小,以便加载它相当快,并将所有大而重的信息推送到子对象或其他实体中。那么,如果你必须大量加载用户,这并不重要;这只是一个指向其他信息的“指针”
我不认为如果你使用JAAS会改变什么,不。尽管我可能会说,就我想象你的目的而言,JAAS可能值得,也可能不值得。在集成、编写权限、使用这些权限、处理SecurityManager的后果等过程中,您可能已经为自己编写了一个简单的权限框架