为了账号安全,请及时绑定邮箱和手机立即绑定

在 WebSocketHandler 中访问 HTTP Session

在 WebSocketHandler 中访问 HTTP Session

慕侠2389804 2021-06-30 09:11:02
亲爱的,我试图在我的 WebSocketHandler 中获得一个 HTTPSession。当我使用“javax.websocket-api”时,我可以成功地做到这一点,但我现在使用的是“Spring-Websocket”。配置:@ConditionalOnWebApplication@Configuration@EnableWebSocketpublic class WebSocketConfigurator implements WebSocketConfigurer {    @Autowired    private ApplicationContext context;    @Override    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {        MyEndpoint endpoint = context.getBean(MyEndpoint.class);        registry.addHandler(endpoint, "/signaling");    }}建立连接时:    @Component    public class MyEndpoint implements WebSocketHandler {        private WebSocketSession wsSession;        @Override        public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {            this.wsSession = webSocketSession;            // need to get the HTTP SESSION HERE                    log.info("Opening: " + webSocketSession.getId());        }    }现在这是我如何使用 'javax.websocket-api' 做到这一点的一个例子:配置:@ServerEndpoint(value = "/signaling", //        decoders = MessageDecoder.class, //        encoders = MessageEncoder.class,        configurator = MyEndpointConfigurator.class)/*** * define signaling endpoint          */public class MyEndpoint extends NextRTCEndpoint {}然后我注入 HTTPSession 修改握手:public class MyEndpointConfigurator extends ServerEndpointConfig.Configurator {    @Override    public void modifyHandshake(ServerEndpointConfig config,            HandshakeRequest request,            HandshakeResponse response) {        HttpSession httpSession = (HttpSession) request.getHttpSession();        config.getUserProperties().put(HttpSession.class.getName(), httpSession);    }}我无法成功地用“Spring Websocket”做类似的事情。任何解决方案?请不要从 StompJS 中推荐类,因为我没有使用它。
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

有一个可以使用:


**

 * An interceptor to copy information from the HTTP session to the "handshake

 * attributes" map to made available via{@link WebSocketSession#getAttributes()}.

 *

 * <p>Copies a subset or all HTTP session attributes and/or the HTTP session id

 * under the key {@link #HTTP_SESSION_ID_ATTR_NAME}.

 *

 * @author Rossen Stoyanchev

 * @since 4.0

 */

public class HttpSessionHandshakeInterceptor implements HandshakeInterceptor {

参考手册中有一个示例如何配置它:


@Override

public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

    registry.addHandler(new MyHandler(), "/myHandler")

        .addInterceptors(new HttpSessionHandshakeInterceptor());

}

因此,您从 HTTP 会话中需要的任何内容都将在WebSocketSession.getAttributes().


查看完整回答
反对 回复 2021-07-07
  • 1 回答
  • 0 关注
  • 249 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信