在Spring中访问Stomp标题

时间:2016-09-16 08:57:13

标签: spring stomp sockjs

我想在stomp标头中设置用户名,并在握手期间在Principal对象中设置该用户名。创建了我自己的HandshakeHandler,但是我无法在我从DefaultHandshakeHandler重写的方法determineUser中获取该用户名。

非常感谢任何帮助。这是相关代码 - >

这是我的客户代码 - >

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

这是我的HandShakeHandler - >

 @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);

     }
 }

1 个答案:

答案 0 :(得分:0)

FWIW,STOMP正在开发WebSocket。当客户端和服务器正在进行WebSocket握手时,STOMP还没有工作。所以显然你没有获得stomp.connect传递的用户名。

我不确定您如何在应用中验证用户身份。但是,如果你有一个身份验证机制,你不必传递用户名,通常已经有一个经过身份验证的用户可以通过HttpServletRequest#getUserPrincipal()访问, 可以在HandShakeHandler中访问。您可以参考spring docs了解更多详情。

但是,如果要通过连接标头发送用户名,您可以在ChannelInterceptor中获取,如this answer中所述。