2016-09-16 11 views
1

stompヘッダーにユーザー名を設定し、ハンドシェイク中にそのユーザー名をPrincipalオブジェクトに設定したいとします。私自身のHandshakeHandlerを作成しましたが、私はDefaultHandshakeHandlerからオーバーライドしているメソッドのユーザー名を取得することができません。SpringのStompヘッダーへのアクセス

ご協力いただければ幸いです。ここに関連するコードです - >

はここに私のクライアントコードです - >

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

    } 
} 

答えて

0

FWIW、STOMPはWebSocketの上部に取り組んでいます。クライアントとサーバーがWebSocketハンドシェイクを行っているとき、STOMPはまだ動作していません。だから、明らかにstomp.connectが渡したユーザ名は得られません。

あなたのアプリでユーザーを認証する方法がわかりません。ただし、認証メカニズムを使用している場合は、通常、HttpServletRequest#getUserPrincipal()、 を介してアクセス可能な認証されたユーザーがHandShakeHandlerでアクセスできるように、ユーザー名を渡す必要はありません。詳細については、spring docsを参照してください。

ただし、接続ヘッダーを使用してユーザー名を送信する場合は、this answerで説明されているように、ChannelInterceptorで取得できます。

関連する問題