当前位置: 首页 > 知识库问答 >
问题:

如果我们将SessionScoped bean注入到无状态bean中,如果没有HTTP会话会发生什么?

鱼志学
2023-03-14

我们的应用程序由与支持bean和无状态EJB服务交互的网页组成,但也有一个与无状态EJB服务交互的远程客户端。

许多服务查询数据库,然后根据当前用户/调用方筛选结果集(例如,用户有权仅查看某些记录类型);也就是说,它们使用编程安全性而不是声明安全性。

在Web端,我的直觉是将当前登录的用户存储在SessionBean中,但我希望无状态EJB服务根据当前登录的用户筛选结果集,以便筛选也适用于远程客户端调用。我可以将SessionBean注入到无状态EJB服务中,但是我认为SessionBean使用HTTP会话,并且由于在远程客户端调用期间没有HTTP会话,我不知道这是如何工作的。

我感觉到我的方法是错误的,我应该从容器中检索“主体”;然而,由于我们应用程序的开发生命周期,容器管理的安全性尚未设置,但我仍然负责实现负责过滤记录的业务逻辑现在而不是以后。

我的密切相关问题:

  • 在知道远程客户端将调用无状态EJB的情况下,是否可以将SessionScoped bean注入到无状态EJB中?在这种情况下,SessionScoped bean的价值是什么

P. S.我是新来JavaEE。

技术:

  • Java EE 6

更新:

有关“远程客户端”的更多详细信息。我不知道该怎么说,因为我是JavaEE新手,但这个“远程客户端”不会通过HTTP。另一个应用程序,我们称之为应用程序X,将从客户端接收XML消息。我认为他们使用证书对客户端进行身份验证。应用程序X将XML转换为POJO,并直接调用我的无状态EJB服务。

在这种情况下,我认为我应该说我不应该将SessionBean注入到无状态的EJB服务中,因为当应用程序X调用EJB服务时,将不会有HTTP会话。我的理解正确吗?

谢谢你的耐心。我知道我对这些事情一无所知。

共有1个答案

傅高逸
2023-03-14

你的问题不是很清楚。你的问题让我假设了很多。所以你应该把你的问题细分,并提供更多的细节。首先,您应该提到您正在使用的javaee版本。不管怎样,这里是我的细节,并根据你的背景做了一些假设。

假设您正在谈论以下支持bean:http://docs.oracle.com/javaee/5/tutorial/doc/bnaqm.html

“无状态bean”==无状态会话bean:http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html#gipin

SessionScoped bean:http://docs.oracle.com/javaee/6/tutorial/doc/gjbbk.html

“远程客户端交互”:http://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html#girfl

对于主要问题,您应该记住将Http会话与有状态会话bean分开:有状态会话bean和Http会话

因此,如果您试图将Http会话与有状态会话bean耦合,那么必须将Http会话详细信息提供给Http会话和有状态会话bean都可以访问数据并保存对数据的引用的区域。

这还假设远程EJB服务不会首先创建超文本传输协议会话。因此,您将没有通过远程EJB对HTTP会话的有效引用。

如果您使用的是基于HTTP的“远程客户端交互”,为什么不在第一个请求上创建HTTP会话?

HttpServletRequest.getSession(true)

将确保你将永远得到一个有效的会话

如果您正在使用一些其他HTTP基础框架,比如jax rs,那么也可以选择在那里获取HTTP会话。

更新1

在知道远程客户端将调用无状态EJB的情况下,是否可以将SessionScoped bean注入到无状态EJB中?在这种情况下,SessionScoped bean的价值是什么?

您可以在EJB中将后备bean用作POJO,但不能将其用作超文本传输协议会话范围的bean。如果您需要从远程EJB使用它们,您必须在使用之前先初始化它们。意味着,在远程EJB调用上没有值。

我的支持bean和无状态EJB服务应该从容器中检索主体,而不是SessionScoped bean吗?

这里的问题也不是很清楚。您可以将容器(glassfish)配置为使用手动用户、角色和领域。因此,这是安全性的本地模拟,您可以从容器中检索主体。http://docs.oracle.com/javaee/6/tutorial/doc/bnbxj.html#bnbxs

独立:我建议您阅读关于JavaEE的Oracle教程。非常好。花点钱,我推荐JavaEE7软件包

 类似资料:
  • 问题内容: 有状态会话bean和HTTP会话之间有什么关系吗?我们将需要有状态会话Bean的用例是什么,而HTTP会话需要哪些用例。我可以将有状态会话Bean公开为静态Web服务吗? 问题答案: HTTP是一种无状态协议, 这意味着 它是服务器和客户端之间的实际传输协议- 是“无状态的, 因为它在调用之间不记得任何东西。 现在,首先阅读一下什么是HTTPSession和什么是Session Bea

  • 问题内容: 我有一个有状态会话Bean(SFSB),它用作身份验证模块。在SFSB中,我存储了登录的当前用户。此外,我还有一些外观(用于处理我的实体的JPA / SQL内容)(无状态会话Bean(SLSB))。为了检查当前用户的访问权限,我尝试从SLSB中调用SFSB。但是,从SLSB调用时,当前用户字段始终为“空”。直接调用SFSB时,当前用户字段设置正确…对于调用,我使用@EJB批注。 任何想

  • 有状态会话bean定义如下: 无状态会话bean无状态会话bean不维护与客户端的会话状态。当客户机调用无状态bean的方法时,该bean的实例变量可能包含特定于该客户机的状态,但仅限于调用期间。当方法完成时,客户端特定状态不应保留。然而,客户端可能会更改池化无状态bean中实例变量的状态,并且此状态将保留到下一次调用池化无状态bean时。除了在方法调用期间,无状态bean的所有实例都是等效的,允

  • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该

  • 对于有状态会话bean(SFSB)和无状态会话bean(SLSB)的用法,我有点困惑。 我知道SFSB与客户保持状态。这很有帮助:什么时候使用有状态会话bean而不是无状态会话bean? 这里和许多其他地方提供的示例是SFSB的购物车。 “如果一个任务需要一系列方法调用(不止一次),并且您需要保留以前的结果以在下一次调用中使用它们,那么就可以使用SFSB”--Source。这将更像是签出(页面之间

  • 问题内容: 我正在使用Node.js,Express和Redis构建一个用于会话管理的网站。无论出于何种原因,如果我有一个会话变量(在此示例中),并且刷新页面,则不会保存该变量,但是,如果我在设置了变量后调用,则确实会将其保存到Redis(redis- cli监视器显示此内容-不调用表示变量不存在,而调用则显示该变量)。 我正在使用它来设置和启动服务器: 然后,在那条路线中,我有: 由此,我应该能