spring-websockets 如何在打开的连接上发送参数

问题描述 投票:0回答:2

我正在使用

TextWebSocketHandler
并覆盖
handleTextMessage
构建用于 Web 套接字连接的 Spring Boot 应用程序。

但我有一个要求,当用户尝试连接到此端点时,我想使用一些令牌进行验证。现在我知道我可以重写

afterConnectionEstablished
afterConnectionClosed
方法,但是在创建套接字连接时是否可以获取一些请求参数或路径参数,以便我可以存储此会话所属的用户的详细信息。

我能够使用 JavaEE7 注释来做到这一点,如下所示,但我被迫使用 Spring :

@ServerEndpoint("/ss/{token}")
public class SocketServerEndpoint {
    @Autowired
    private SService ssService;

    @OnOpen
    public void open(Session session, @PathParam("token")String token) throws SSException {
        ssService.processConnectionRequest(token, session);
    }

    @OnMessage
    public String handleMessage(String message, Session session) {
        ssService.processMessage(message);
        return "message_received";
    }

    @OnClose
    public void close(Session session) {
        ssService.removeSession(session);
    }
}

我是 Spring Boot 和 Spring Web Sockets 的新手,无法找到方法,请帮助!

java spring spring-boot spring-websocket java-websocket
2个回答
3
投票

您可以实现WebSocketConfigurer并重写registerWebSocketHandlers方法 定义您的端点,然后检索并放入属性。

public void registerWebSocketHandlers(WebSocketHandlerRegistry registery) {
    logger.info("websocketHanlder registering Socket Handler .");
    registery.addHandler(new SocketTextHandler(), "ss/{token}").addInterceptors(getInter);
}

     private HandshakeInterceptor getInter() {
    return new HandshakeInterceptor() {
        @Override
        public boolean beforeHandshake(ServerHttpRequest serverHttpRequest,
                                       ServerHttpResponse serverHttpResponse,
                                       WebSocketHandler webSocketHandler,
                                       Map<String, Object> map) {
            logger.info("Request ---------- {}",  serverHttpRequest.getHeaders());

            String path = serverHttpRequest.getURI().getPath();
            logger.info("PATH:  {}", path);
            int index = path.indexOf("/ss");
            String id = path.substring(index);
            map.put("id", id);
            return true;
        }

        @Override
        public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {}
    };
}

将其放在地图上后,可以从会话属性中检索它。


0
投票

您可以使用ApplicationContext事件。有关更多信息,请参阅 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-appplication-context-events

并且这里我解释了如何实现事件监听器来捕获特定事件。

© www.soinside.com 2019 - 2024. All rights reserved.