Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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 我可以在CDI中使用EJB无状态Bean来维护用户会话吗?_Java_Jsf 2_Java Ee 6_Cdi_Ejb 3.1 - Fatal编程技术网

Java 我可以在CDI中使用EJB无状态Bean来维护用户会话吗?

Java 我可以在CDI中使用EJB无状态Bean来维护用户会话吗?,java,jsf-2,java-ee-6,cdi,ejb-3.1,Java,Jsf 2,Java Ee 6,Cdi,Ejb 3.1,基于这篇文章,我在我的应用程序@Named@statelessbean中使用它与数据库通信(这里注入EntityManager),并在jsf页面上显示信息。自JavaEE5以来,这是一个很好的促进,但我有一个问题 使用这样的bean来维护用户会话(购物车等)安全吗?我读过一本关于EJB3.0的书,我知道相同的无状态bean可以用于许多客户机 使用具有所有ejb特性(事务、线程安全等)的托管bean的最佳方法是什么?我的意思是,除了JavaEE5中的托管bean+ejb接口和实现+ejb注入之外,

基于这篇文章,我在我的应用程序@Named@statelessbean中使用它与数据库通信(这里注入EntityManager),并在jsf页面上显示信息。自JavaEE5以来,这是一个很好的促进,但我有一个问题

使用这样的bean来维护用户会话(购物车等)安全吗?我读过一本关于EJB3.0的书,我知道相同的无状态bean可以用于许多客户机

使用具有所有ejb特性(事务、线程安全等)的托管bean的最佳方法是什么?我的意思是,除了JavaEE5中的托管bean+ejb接口和实现+ejb注入之外,还有其他方式吗


我使用GlassFish 3.1 WebProfile

无状态bean无法维护购物车或会话;这就是“无国籍”的含义


您需要一个有状态的EJB,或者在web层中实现它。这些地方是唯一可以维持会话的地方。

补充了达菲莫的建议;与使用HTTP会话相比,使用有状态会话bean还有一些额外的注意事项

HTTP会话基本上具有类似于映射的结构。它可直接用于会话中的所有线程(请求)。这使得操纵多个项目成为相对不安全的行为。可以在会话本身上进行同步,但这是一个有风险的操作,可能会导致整个应用程序死锁。HTTP会话确实允许您声明事件侦听器,在对HTTP会话进行任何类型的修改时触发

有状态会话bean当然有一个bean结构。它有一种自动同步特性,因为只有线程可以同时在bean中处于活动状态。通过注释,您可以声明其他线程是否等待(如果等待,等待多长时间)或在并发访问时立即抛出异常

在每个用户通常只有一个http会话的情况下,单个用户可以同时使用多个有状态会话bean。有状态会话bean的一个特别优点是,它们有一种机制,可以在超时后使其状态被动化,这可以释放服务器的内存(当然是以磁盘空间为代价的)。有状态会话bean不直接具有http会话所具有的事件侦听器类型

我认为,最初有状态会话bean的“会话”方面是维护与远程非web客户端(Swing、另一个AS等)的会话。这与创建http会话以维护与远程web客户端的会话非常相似。由于非web客户端可以为有状态会话bean请求并保留多个代理,因此web类比实际上更类似于最近引入的
对话范围

在远程web客户机与服务器对话的情况下,服务器在内部与有状态会话bean对话,概念大大重叠。远程web客户端只知道http会话(通过JSSessionID),而不知道有状态会话bean的会话。因此,如果http会话丢失,您通常将无法再次将远程客户端与特定的有状态会话bean连接起来。因此,本例中的HTTP会话始终处于引导状态,您还可以将购物车项目存储在单个(HTTP)会话范围的bean中


有一种特定的情况是,有状态会话bean对于内部通信非常方便,这就是如果您需要JPA的
扩展持久性上下文
。例如,如果实体上的锁需要在两次请求之间保持不变(如果您的库存有限,并且不想在用户实际退房时立即向他发送“缺货”消息,那么这对购物车来说可能很方便)。

谢谢您的回答,那么我应该使用@Named@Stateful还是jsf会话?哪个更好/更轻?当用户关闭浏览器和ejb会话?或者可能将ENtityManager注入ManagedBean时,jsf会话结束?它安全吗?EJB会话不一定在用户关闭浏览器时结束,但是web用户以后无法再次连接EJB会话。EJB代理通常保存在http会话、会话或视图作用域中,当主http会话结束时,这些作用域都将被销毁。>或者可能将EntityManager注入ManagedBean?-可能,但不如使用EJB方便,因为在这种情况下,您自己负责启动、提交或回滚事务。如果托管bean被注入实体管理器,那么它也应该是会话作用域,而不是会话作用域。您需要用DB操作分离数据(会话范围)。实体管理器通常不是线程安全的。