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

时间:2016-05-25 13:45:08

标签: java spring spring-boot spring-websocket java-websocket

我正在使用TextWebSocketHandler构建一个用于Web套接字连接的spring boot应用程序并覆盖handleTextMessage

但我要求当用户尝试连接到此端点时,我想使用某些令牌进行验证。现在我知道我可以覆盖afterConnectionEstablishedafterConnectionClosed方法但是在创建套接字连接时可以获得一些请求参数或路径参数,以便我可以存储该会话所属的用户的详细信息。

我能够使用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的新手,无法找到方法,请帮助!!!

2 个答案:

答案 0 :(得分:0)

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

here我解释了如何实现事件监听器来捕获特定事件。

答案 1 :(得分:0)

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

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

 private HandshakeInterceptor getInter() {
    return new HandshakeInterceptor() {
        @Override
        public boolean beforeHandshake(ServerHttpRequest serverHttpRequest,
                                       ServerHttpResponse serverHttpResponse,
                                       WebSocketHandler webSocketHandler,
                                       Map<String, Object> map) throws Exception {
            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;
        }
  }

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

相关问题