在Spring中访问Stomp头

在Spring中访问Stomp头,spring,stomp,sockjs,Spring,Stomp,Sockjs,我想在stomp头中设置一个用户名,并在握手过程中在主体对象中设置该用户名。创建了我自己的HandshakeHandler,但我无法在从DefaultHandshakeHandler重写的方法determineUser中获取该用户名 任何帮助都将不胜感激。以下是相关代码--> 这是我的客户代码--> 这是我的握手手--> @覆盖 公共无效注册表TompendPoints(StompEndpointRegistry注册表){ registry.addEndpoint(“/chat”).setHan

我想在stomp头中设置一个用户名,并在握手过程中在主体对象中设置该用户名。创建了我自己的HandshakeHandler,但我无法在从DefaultHandshakeHandler重写的方法determineUser中获取该用户名

任何帮助都将不胜感激。以下是相关代码-->

这是我的客户代码-->

这是我的握手手-->

@覆盖
公共无效注册表TompendPoints(StompEndpointRegistry注册表){
registry.addEndpoint(“/chat”).setHandshakeHandler(新的随机用户名handshakeHandler()).withSockJS();
}
私有类RandomUsernameHandsheHandler扩展了DefaultHandsheHandler{
@凌驾
受保护的主体确定器(ServerHttpRequest请求、WebSocketHandler、wsHandler、映射属性){
//一些代码会给我在Stomp头中设置的用户名
//现在,我在principal中随机生成用户名和设置。
字符串username=“user”+“-”+new Random().nextInt(100);
返回新的用户名PasswordAuthenticationToken(用户名,null);
}
}

FWIW,STOMP正在WebSocket顶部工作。当客户端和服务器进行WebSocket握手时,STOMP还不能工作。因此,很明显,stomp.connect不会传递用户名

我不确定如何在应用程序中验证用户。但是,如果您确实具有身份验证机制,则不必传递用户名,通常已经有一个经过身份验证的用户可以通过HttpServletRequest#getUserPrincipal()访问, 可通过握手器访问。有关更多详细信息,请参阅

但是,如果您希望通过连接头发送用户名,您可以在ChannelInterceptor中获得它,如中所述

var from = document.getElementById('username').value;
var socket = new SockJS('/WebSocketsChat/chat');
stompClient = Stomp.over(socket);  

stompClient.connect({userName:from,sampleMsg:"Hello"},    
function(frame) {   
// Some more code here
 @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
         registry.addEndpoint("/chat").setHandshakeHandler(new RandomUserNameHandshakeHandler()).withSockJS();
    }


 private class RandomUserNameHandshakeHandler extends DefaultHandshakeHandler{

     @Override
     protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String,Object> attributes){

         // Some Code that would give me the username set in Stomp Header
         // For now i am randomly generating a username and setting in principal.
         String username = "user"+"-"+ new Random().nextInt(100);
         return new UsernamePasswordAuthenticationToken(username,null);

     }
 }