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

Java 如果我们将SessionScoped bean注入到无状态bean中,如果没有HTTP会话会发生什么?,java,jakarta-ee,architecture,ejb,cdi,Java,Jakarta Ee,Architecture,Ejb,Cdi,我们的应用程序由与支持bean和无状态EJB服务交互的网页组成,但也有一个与无状态EJB服务交互的远程客户端 许多服务查询数据库,然后根据当前用户/调用者过滤结果集(例如,用户只有查看某些记录类型的权限);也就是说,它们使用编程安全性而不是声明安全性 在web端,我的直觉是将当前登录的用户存储在SessionBean中,但我希望无状态EJB服务根据当前登录的用户过滤结果集,以便在远程客户端调用期间也应用过滤。我可以将SessionBean注入到无状态EJB服务中,但我认为SessionBean使

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

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

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

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

我的密切相关问题:

  • 在知道远程客户端将调用无状态EJB的情况下,是否可以将SessionScoped bean注入到无状态EJB中?在这种情况下,SessionScoped bean的价值是什么
  • 我的支持bean和无状态EJB服务应该从容器中检索主体,而不是SessionScoped bean吗?
    • 如果是,在设置容器管理的安全性之前,如何替换模拟主体来处理业务逻辑
  • p、 我对JavaEE是新手

    技术:

    • Java EE 6
    • 玻璃鱼3.1.2.2
    • “backingbean”例如
      javax.enterprise.context.SessionScoped
    • “无状态EJB服务”,例如
      javax.EJB.Stateless
    • “远程客户端”;i、 e.一些非web客户机直接调用无状态bean(通过EJB/RMI)
    更新:

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

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


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

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

    假设你说的是 背豆:

    “无状态bean”==无状态会话bean:

    会话范围的bean:

    “远程客户端交互”:

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

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

    这还假设远程EJB服务不会首先创建http会话。因此,您将无法通过远程EJB获得对HTTP会话的有效引用

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

    HttpServletRequest.getSession(true)
    
    将确保您始终获得有效的会话

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

    更新1

    一个SessionScoped bean可以被注入到一个无状态EJB中吗 远程客户端将调用无状态EJB?问题是什么 在这种情况下SessionScoped bean的值是多少

    您可以将支持bean用作EJB中的POJO,但不能用作http会话范围的bean。如果您需要从远程EJB中使用它们,您必须在使用之前首先对它们进行初始化。也就是说,远程EJB调用没有任何价值

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

    这里的问题也不是很清楚。 您可以将容器(glassfish)配置为使用手动用户、角色和领域。因此,这是安全性的本地模拟,您可以从容器中检索主体。


    独立:我建议您阅读关于JavaEE的Oracle教程。非常好。拿一些钱,我推荐您使用Java EE 7 Essentials,您的问题还不完全清楚。你的问题让我假设了很多。所以你应该把你的问题细分,并提供更多的细节。 首先,您应该提到您正在使用的javaee版本。不管怎样,这里是我的细节,并根据你的背景做了一些假设

    假设你说的是 背豆:

    “无状态bean”==无状态会话bean:

    会话范围的bean:

    “远程客户端交互”:

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

    因此,如果您试图将Http会话与有状态会话bean耦合,则必须在中提供Http会话详细信息