用户连接时获取本机标头

时间:2016-01-25 23:40:50

标签: java spring-boot stomp sockjs

我有客户端在websocket上连接这样的

var socket = new SockJS(this.props.stomp);
var stompClient = Stomp.over(socket);
var channel = "/room."+this.props.room.uid
var app = this;
stompClient.connect({room: this.props.room.uid}, function(frame) {
....

在我的Java后端我正在尝试按照教程获取此标题:

public void onApplicationEvent(SessionConnectEvent event) {
    StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());

    String  room = sha.getNativeHeader("room").get(0);
    logger.debug("Connect event [sessionId: " + sha.getSessionId() +"; room: "+ room + " ]");
}

但此时room为空 我调试并发现了一个非常复杂的层次结构:MessageHeaderAccessor包含一个包含LinkedList的映射,该列表包含一个名为nativeHeaders的密钥,其中包含这些本机标头。
我的问题:有没有一种简单的方法来访问这个本机标题?到目前为止,我只得到像

这样的东西
MessageHeaderAccessor accessor = NativeMessageHeaderAccessor.getAccessor(event.getMessage(), SimpMessageHeaderAccessor.class);
accessor.getMessageHeaders();
Object header = accessor.getHeader("simpConnectMessage");
GenericMessage<?> generic = (GenericMessage<?>) accessor.getHeader("simpConnectMessage");
System.out.println(generic.getHeaders().get("nativeHeaders"));

我真的很难理解和使用。实际上,我唯一想要的是跟踪当前连接到频道的用户数量,我认为实现ApplicationListener就是这样。我可能在这里错了,所以如果有人找到了什么或实现了类似的东西,我想知道

1 个答案:

答案 0 :(得分:1)

我是这样做的:

  1. javascript 代码段

    function connect() {
        var socket = new SockJS('http://localhost:8081/ws/notification');
        stompClient = Stomp.over(socket);
    
        var header = {
            "user-id" : "bb2c9039-0ed3-4d6f-b078-db965286944d"
        }
    
        stompClient.connect(header, function (frame) {
            console.log('Connected: ' + frame);
            stompClient.subscribe('/user/ws/notification/message', function (greeting) {
                showGreeting(JSON.parse(greeting.body).name);
            });
        });
    }
    
  1. Java 代码段

    @EventListener
    public void handleWebSocketConnectListener(SessionConnectedEvent event) {
        StompHeaderAccessor accessor = StompHeaderAccessor.wrap(event.getMessage());
    
        String sessionId = accessor.getMessageHeaders().get(SimpMessageHeaderAccessor.SESSION_ID_HEADER, String.class);
        String userId = getUserId(accessor);
    
        log.info("User( user-id: {} ) established new WebSocket session( session-id: {} ).", userId, sessionId);
        putSessionIdToMap(sessionId, userId);
    }
    
    private String getUserId(StompHeaderAccessor accessor) {
        GenericMessage<?> generic = (GenericMessage<?>) accessor.getHeader(SimpMessageHeaderAccessor.CONNECT_MESSAGE_HEADER);
        if (nonNull(generic)) {
            SimpMessageHeaderAccessor nativeAccessor = SimpMessageHeaderAccessor.wrap(generic);
            List<String> userIdValue = nativeAccessor.getNativeHeader("user-id");
    
            return isNull(userIdValue) ? null : userIdValue.stream().findFirst().orElse(null);
        }
    
        return null;
    }