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

如何传播CDI会话bean从HTTP会话到WebSocket会话?

汪迪
2023-03-14

在发布这个问题之前,我谷歌了很多这个问题,并且在网络Socket@ServerEndpoint中从HttpServletRequest访问Http会话是我能找到的最好的问题/答案之一,但它似乎不能解决我的问题。

我可以通过这种方式从websocket访问HttpSession,但是我无法访问与普通HTTP请求相同的CDI会话bean实例。

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

那么我的问题是:在这两种情况下(WebSocket事件和HTTP普通请求),是否可以访问相同的CDI管理的会话bean实例?

目前,让这个特性在Wildfly 9/10中工作对我来说很重要,但如果有一个通用的解决方案,比如在Tomcat上工作,那就太好了

提前感谢您的支持。

共有1个答案

曹鸿风
2023-03-14

那么我的问题是:在这两种情况下(WebSocket事件和HTTP普通请求),是否可以访问相同的CDI管理的会话bean实例?

仅在握手请求期间,因为这是一个HTTP请求。HTTP会话仅在HTTP请求期间可用,而在WS请求期间不可用。希望原因现在已经很明显了,因为CDI将会话范围的bean存储在HTTP会话中,该会话只能由HTTP请求识别,在WS请求期间,任何地方都没有物理HTTP请求,因此HTTP会话也不可用。

最好的办法是生成一个唯一标识符,将其存储在会话范围的bean中,将其添加到WS URL(作为路径或请求参数),在onOpen期间提取它,并将其存储在应用程序范围的bean中。在正常JavaEE服务器中,应用程序范围的CDI bean可以通过WSendpoint类中的@Inject以通常的方式获得(但在Tomcat/Jetty/etc中不行,您必须通过BeanManager手动获取它)。最后,只需让包含唯一标识符的会话作用域bean查询应用程序作用域bean,以获取该标识符打开的套接字。

至少,我在开发OmniFaces

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

  • 在用户登录时续订HTTP会话是常见的最佳做法。这将强制使用新的会话ID,从而避免会话固定漏洞。 当涉及@SessionScoped bean时,是否有使用CDI实现此功能的首选模式?困难在于,通过使当前HTTP会话无效,您将在下一个请求中获得不同的会话范围bean,但直到下一个请求。 例如,假设一个用于存储用户登录信息的会话bean: 和另一个用于管理登录的bean: 对于托管Bean,这将检索一

  • MyCart.java 这个MyCart Bean是每个HTTP会话实例化的名为CDI的Bean。 抽象类 问题描述 仅用于理解会话范围的CDI。我有两个JSP文件,如下所示 SetCDIBeanValue.jsp其中,我将获得命名会话CDI Bean(MyCart)的实例将It String属性的值设置为String值FROM_FIRST_JSP 因为这个会话的作用域是有限的,所以我想应该只有一

  • 恐怕这个问题会有点模糊,但这是... 我们注意到我们的JEE7 web应用程序中存在一些非常奇怪的、偶然的行为。有时,用户页面会突然开始显示来自完全不同用户会话的数据!到目前为止,我还没有能够复制这种现象,也没有在日志中找到任何问题的迹象,但是似乎一个用户的页面开始显示存储在@SessionScoped CDIBean中的数据,该CDIBean应该属于另一个用户的会话。 这种行为对任何人都有影响吗

  • 我有一个CDI bean,定义如下: 现在,我想以编程方式将其从会话范围中删除: 但是变量始终为空。如何检索实例并销毁它?

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