使用Glassfish领域和Context
我可以使用UserPrincipal.getName()
和isUserInRole
方法检索有关登录用户的信息。
但是,我需要在EJB之间共享更多数据,例如:有关我可以通过数据库或LDAP获取的用户的信息(例如名称,域等)。
我不是在询问如何检索这些信息,但我花了好几个小时才找到一种好方法将它传递到会话/请求中调用的所有EJB。
我已经阅读了EJBContext.getContextData()
,但似乎这个属性没有被传播,我不能使用存储它们的EJB之外的存储值。我还阅读了关于实现我自己的UserPrincipal的内容,但是我不知道如何为Glassfish做这个,并继续使用glassfish默认领域配置。
我不想修改我的EJB签名来传递信息,但我想不出另一种正确的方法。
你有什么想法吗?
答案 0 :(得分:2)
由于您正在使用Glassfish,您可以使用JASPIC,它是跨层传递凭证数据的Java EE标准。编写JASPIC适配器本身并不太难,它通常是一个简单的层,除非您像我一样实现OpenID Connect身份验证,因为您通常只使用JAVA EE7 API提供的内容而不是其他支持库。
答案 1 :(得分:0)
乍一看,没有查看你的代码,也许你可以使用拦截器,你的要求听起来像AOP(你可以在拦截器中注入资源,如SessionContext)。所以,你在执行方法之前和之后都会抓住方法并做一些魔术。
如果这还不够,我想到的另一个想法就是使用CDI生成器,你创建了一个方法,用你需要的信息生成一个Object,在某些时候你可以将它作为依赖项注入你的EJB:
答案 2 :(得分:-1)
这实际上是不可能的。如果您只使用本地调用,则可以使用ThreadLocal,但请确保在调用完成时将其删除,以避免在池化线程上泄漏内存。如果你正在使用远程,我不知道任何其他解决方案,除了修改方法签名。