Spring websocket send to specific people

前端 未结 2 1673
醉梦人生
醉梦人生 2020-12-23 18:02

I have added custom token based authentication for my spring-web app and extending the same for spring websocket as shown below

public class WebSocketConfig          


        
2条回答
  •  攒了一身酷
    2020-12-23 18:46

    In my previous project I sent messages to one specific user; in detail I wrote the following:

    CLIENT SIDE:

    function stompConnect(notificationTmpl) 
    {
        var socket = new SockJS('/comm-svr');
        stompClient = Stomp.over(socket);
        var theUserId 
        stompClient.connect({userId:theUserId}, function (frame) {
                debug('Connected: ' + frame);
                stompClient.subscribe('/topic/connect/'+theUserId, function (data)                   {
    //Handle data
                  } 
            });
    }
    

    SERVER SIDE

    Spring websocket listener:

    @Component
    public class WebSocketSessionListener
    {
        private static final Logger logger = LoggerFactory.getLogger(WebSocketSessionListener.class.getName());
        private List connectedClientId = new ArrayList();
    
        @EventListener
        public void connectionEstablished(SessionConnectedEvent sce)
        {
            MessageHeaders msgHeaders = sce.getMessage().getHeaders();
            Principal princ = (Principal) msgHeaders.get("simpUser");
            StompHeaderAccessor sha = StompHeaderAccessor.wrap(sce.getMessage());
            List nativeHeaders = sha.getNativeHeader("userId");
            if( nativeHeaders != null )
            {
                String userId = nativeHeaders.get(0);
                connectedClientId.add(userId);
                if( logger.isDebugEnabled() )
                {
                    logger.debug("Connessione websocket stabilita. ID Utente "+userId);
                }
            }
            else
            {
                String userId = princ.getName();
                connectedClientId.add(userId);
                if( logger.isDebugEnabled() )
                {
                    logger.debug("Connessione websocket stabilita. ID Utente "+userId);
                }
            }
        }
    
        @EventListener
        public void webSockectDisconnect(SessionDisconnectEvent sde)
        {
            MessageHeaders msgHeaders = sde.getMessage().getHeaders();
            Principal princ = (Principal) msgHeaders.get("simpUser");
            StompHeaderAccessor sha = StompHeaderAccessor.wrap(sde.getMessage());
            List nativeHeaders = sha.getNativeHeader("userId");
            if( nativeHeaders != null )
            {
                String userId = nativeHeaders.get(0);
                connectedClientId.remove(userId);
                if( logger.isDebugEnabled() )
                {
                    logger.debug("Connessione websocket stabilita. ID Utente "+userId);
                }
            }
            else
            {
                String userId = princ.getName();
                connectedClientId.remove(userId);
                if( logger.isDebugEnabled() )
                {
                    logger.debug("Connessione websocket stabilita. ID Utente "+userId);
                }
            }
        }
    
        public List getConnectedClientId()
        {
            return connectedClientId;
        }
        public void setConnectedClientId(List connectedClientId)
        {
            this.connectedClientId = connectedClientId;
        }
    }
    

    Spring websocket message sender:

    @Autowired
        private SimpMessagingTemplate msgTmp;
        private void propagateDvcMsg( WebDeviceStatusInfo device )
        {
            String msg = "";
            String userId =((Principal)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getName()
            msgTmp.convertAndSend("/topic/connect"+userId, msg);
        }
    

    I hope it's useful

提交回复
热议问题