无状态EJB:在性能和安全性之间找到平衡点

时间:2009-09-16 07:26:27

标签: java performance security ejb-3.0

我有一个JSF Web客户端和一个Java客户端,它们都为其应用程序逻辑使用相同的无状态EJB层。我不确定如何平衡性能需求(限制在表示层和应用程序层之间传输的数据量)与安全性(在确保所有决策都是基于最新数据的意义上)。

我理解这是一个主观话题,所以也许我可以通过具体的例子使其更加客观:

  • 我是否只将用户名发送给EJB,然后在每次EJB调用中加载User实体,还是从表示层发送User实体?
  • 如果我需要的信息不仅仅是User实体(假设我需要在每次EJB调用时加载一个额外的实体),我是否要发送用户名和另一个实体的密钥并加载应用层中的两个实体,或者从演示层发送两个entites?
  • 如果我需要更多关于某些EJB调用的信息(> = 3个实体)呢?

什么时候发送实际的实体而不仅仅是它的键是有意义的,或者答案永远不是,总是在应用程序层重新加载?我应该担心表现吗?我听说Hibernate(我正在使用)采用智能缓存,这意味着用户实体可能不会每次都从数据库重新加载?如果我的EJB方法具有非常小的粒度并且前端操作有时会导致调用3个或更多EJB方法,每个方法都需要加载User实体,那该怎么办?

最后一个相关问题:我打算使用JAAS主体来存储EJB加载的用户名。如果我的远程外观EJB调用一堆也需要用户信息的本地无状态EJB,我是否仍然使用JAAS主体并在每个主体中加载User实体或者有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您应该考虑有状态EJB,因为它听起来像客户端需要非平凡状态来回答一个用户关于相同状态的一系列请求。也就是说,有状态EJB是一种可以正确编写和配置的熊。

作为设计问题,我不会让客户端将用户信息发送到业务逻辑层。一,它只是将问题交给客户,不是吗?加载,存储和发送此信息?从安全角度来看,它让我感到紧张,让一个可能安全性较低的客户端层将敏感用户数据提供给更安全的后端层,后端层然后信任并使用该信息。

但是,实际上,我认为你已经提到了最好的方法:Hibernate的延迟加载。您只需与对象进行交互,然后按需加载数据。为了在这方面与Hibernate一起使用,User对象应该很小,以便加载它相当快,并将所有大而重的信息推送到子对象或其他实体。那么你是否需要加载用户并不重要;它只是对其他信息的“指针”。

如果您使用JAAS,我认为它不会改变,不。虽然我可能会说,根据我的想象,你的目的是,JAAS可能是也可能不值得。在您需要集成,编写权限,使用这些权限,处理SecurityManager的后果等时,您可能无论如何都可以为自己编写一个简单的权限框架。

答案 1 :(得分:0)

如果只创建一个EJB,则进行无状态会话。我个人发现它是空的接口