Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用远程EJB和Web服务保持状态_Java_Web Services_Ejb 3.0_State - Fatal编程技术网

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

Java 使用远程EJB和Web服务保持状态,java,web-services,ejb-3.0,state,Java,Web Services,Ejb 3.0,State,我有一个基于web的应用程序,它将远程EJB用于其业务逻辑。其中一些EJB还作为Web服务公开。我需要为其中一些调用保持一个较小的状态,以便允许后续调用正常运行。你会推荐以下哪一项 有状态EJB(这是否适用于Web服务?) 将状态返回给客户端(如果我想阻止客户端更改状态怎么办?) 在每个方法上从DB重新加载状态(我应该担心开销吗?) 所有三种建议的解决方案都可以发挥作用,但最佳解决方案将取决于您的应用程序的细节 我根本不使用有状态会话bean(SFSB)。SFSB的设计目的是保持会话状态,但通

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

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

所有三种建议的解决方案都可以发挥作用,但最佳解决方案将取决于您的应用程序的细节

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

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


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

唯一的选择是在数据库中存储与特定用户ID相关的适当信息

不能将Statefull bean公开为Webservice


在将bean公开为Web服务的情况下,您可以尝试通过放入SOAP头来来回发送附加信息,以防止在主体中进行修改。但在这种情况下,客户端可以对其进行更改。

请详细说明数据库状态保存方法?如何处理会话超时(这需要一些清理)?数据库状态方法最适用于绑定到用户帐户而不是会话的数据。从逻辑上讲,每个请求都会重新加载数据,但实际上,实体bean或数据库或两者都会缓存状态,因此数据通常可以按需使用。缓存通过逐出策略管理自己的内存使用情况,例如最近最少使用的内存。除非使用这种方法来管理会话状态,否则不需要自己管理清理。虽然可以使用计时器进程删除旧会话,但最好在web层中管理会话状态。假设您的基于web的应用程序具有jsp/jsf前端,是否有理由不能使用web容器上的“会话”来存储EJB/WS调用之间的状态?Ryan,是的,我可以将状态返回到web容器并将其存储在HttpSession中而不必担心,但是同样的方法也可以通过web服务从其他客户端访问,在这种情况下,我希望防止它们更改状态。