使用远程EJB和Web服务保持状态

时间:2009-07-14 07:51:38

标签: java web-services ejb-3.0 state

我有一个基于Web的应用程序,它将远程EJB用于其业务逻辑。其中一些EJB也作为Web服务公开。我需要为其中一些调用保持一个小状态,以便后续调用正常运行。您会推荐以下哪一项?

  • 有状态EJB(这将与Web服务一起使用吗?)
  • 将状态返回给客户端(如果我想阻止客户端改变状态,该怎么办?)
  • 在每个方法上从DB重新加载状态(我应该担心开销吗?)

2 个答案:

答案 0 :(得分:2)

所有三种提议的解决方案都可以使用,但最佳解决方案将取决于您的应用程序的详细信息。

我根本不使用有状态会话Bean(SFSB)。 SFSB旨在保持会话状态,但通过Web服务使用它们会引发关于会话究竟是什么的问题?如果您有一个复杂的部署环境或用户使用该应用程序的多个实例,那么这可能是一个脆弱的解决方案。

返回状态 - 正如问题所示,除非您确定服务器可以信任其客户端,否则可能存在安全问题。您可以使用加密技术来验证状态对象是否未被修改,但是不将敏感数据提供给潜在的恶意客户端会更安全。另一种可能有用的情况是,如果允许客户端改变状态,或者如果客户端这样做,则不会造成任何伤害。如果客户端对系统的访问始终是通过Web层进行的,那么这是存储会话状态的好地方。 Web层和应用层可以安全地交换状态对象。

从数据库重新加载状态可能是最普遍适用的方法。如果您使用实体bean或对象关系映射库,那么服务器应该能够减少数据库查询的数量。

答案 1 :(得分:1)

您唯一的选择是在DB中存储与某个UserId相关的适当信息。

您不能将Statefull bean公开为Webservice。

如果将Beans作为Web服务公开,您可以尝试通过放入SOAP标头来反复发送其他信息,以防止对正文进行修改。但在这种情况下,客户将能够改变它。