jakarta-ee - 如何将 CDI session bean 从 HTTP session 传播到 WebSocket session ?

标签 jakarta-ee websocket cdi httpsession session-scope

在发布这个问题之前,我用谷歌搜索了很多这个问题,并 Accessing HttpSession from HttpServletRequest in a Web Socket @ServerEndpoint是我能找到的最好的问题/答案之一,但它似乎不能解决我的问题。

我能够以这种方式从 websocket 访问 HttpSession,但无法访问与普通 HTTP 请求相同的 CDI session bean 实例。

我也尝试在 session 中存储 HttpSessionContextImpl Weld 实例,并尝试在 WebSocket 端使用它,但它没有公开以前的 bean。

然后我的问题:在两种情况下(WebSocket 事件和 HTTP 正常请求)是否可以访问相同的 CDI 托管 session bean 实例?

目前,让这个功能在 Wildfly 9/10 中工作对我来说很重要,但如果有一个通用的解决方案也能在 Tomcat > 7 上工作(使用 jBoss Weld 或任何其他实现),那就太好了。

预先感谢您的支持。

最佳答案

Then my question: Is it possible to access the same CDI managed session bean instances in both cases (WebSocket events and HTTP normal requests)?

仅在握手请求期间,因为那是 HTTP 请求。 HTTP session 仅在 HTTP 请求期间可用,在 WS 请求期间不可用。希望原因现在已经很明显了,因为 CDI 将 session 范围的 Bean 存储在 HTTP session 中,只能通过 HTTP 请求来识别,并且在 WS 请求期间,任何地方都无法进行物理 HTTP 请求,因此 HTTP session 也不可用。

您最好的选择是生成一个唯一标识符,将其存储在 session 范围的 bean 中,将其添加到 WS URL(作为路径或请求参数),在 onOpen 期间提取它。并将其存储在应用程序范围的 bean 中。在普通的 Java EE 服务器中,应用程序范围的 CDI bean 可通过 @Inject 获得。以通常的方式在 WS 端点类中(但不是在 Tomcat/Jetty/等中,您必须通过 BeanManager 手动获取它)。最后,让包含唯一标识符的 session 作用域 bean 查阅应用程序作用域 bean,以获取通过该标识符打开的任何套接字。

至少,我在开发 OmniFaces 时走了这条路 <o:socket> JSF 的标签。全部开源,可以在its showcase page底部找到源码链接.

关于jakarta-ee - 如何将 CDI session bean 从 HTTP session 传播到 WebSocket session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36177742/

相关文章:

java - Log4J fileappender 无法在 Websphere 7 上滚动

Golang 一对一聊天

dependency-injection - 当injectionpoint.getBean()可以为null时的CDI

java - CDI:通过静态方法获取对 beanManager 的引用

jakarta-ee - 必须在调用activate()之前调用associate()

java - 在网络服务器上运行geotools?

java - NetBeans EE 包括 Java EE?

java - ADMA5014E 将 Mavenized Java 应用程序安装到 WebSphere 时出错,并出现 NoModuleFileException : "A file does not exist for module element having uri"

ruby-on-rails - 无法使用 AnyCable 通过 websocket 连接 Rails 和 Go

php - 使用 Ratchet php 而不使用 ZeroMQ 将消息推送到 websockets