有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring WebSocket StompHeaderAccessor

如果我执行以下代码,sha.getLogin()sha.getPasscode()输出null!? 代码有什么问题

客户:

var socket = new SockJS('/ws');
stompClient = Stomp.over(socket);
stompClient.connect("123","456", function (frame) {
    //...
});

服务器:

@EventListener
private void onSessionConnect(SessionConnectedEvent event)
{
    StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());

    System.out.println(sha.getLogin());
    System.out.println(sha.getPasscode());
}

但如果执行以下命令,则包含登录名和密码

sha.getMessageHeaders().toString()

输出(无json):

{  
    simpMessageType=CONNECT_ACK,
    simpConnectMessage=GenericMessage[  
        payload=byte[0],
        headers={  
            simpMessageType=CONNECT,
            stompCommand=CONNECT,
            nativeHeaders={  
                login=[123],//<<<Login
                passcode=[PROTECTED],//<<<Passcode
                accept-version=[  
                    1.1,
                    1.0
                ],
                heart-beat=[  
                    10000,
                    10000
                ]
            },
            simpSessionAttributes={},
            simpHeartbeat=[J@4b5cea63,
            stompCredentials=[PROTECTED],
            simpSessionId=xhojby2n
        }
    ],
    simpSessionId=xhojby2n
}

共 (2) 个答案

  1. # 1 楼答案

    你可以使用访问器。方法而不是访问器。getFirstNativeHeader(密码_头) B因为设置密码时使用默认密码保护密码

    public void setPasscode(@Nullable String passcode) {
        setNativeHeader(STOMP_PASSCODE_HEADER, passcode);
        protectPasscode();
    }
    
    private void protectPasscode() {
        String value = getFirstNativeHeader(STOMP_PASSCODE_HEADER);
        if (value != null && !"PROTECTED".equals(value)) {
            setHeader(CREDENTIALS_HEADER, new StompPasscode(value));
            setNativeHeader(STOMP_PASSCODE_HEADER, "PROTECTED");
        }
    }
    
  2. # 2 楼答案

    当您调用sha.getLogin()sha.getPasscode()时,Spring正在访问会话数据,但是您的用户在会话上没有经过身份验证,当您发送connect ACK时,您需要截获消息并在会话上对用户进行身份验证

    看看Spring Security WebSocket Support & Sessions