2016-09-16 64 views
1

我想在stomp頭文件中設置一個用戶名,並在握手期間在Principal對象中設置該用戶名。創建了我自己的HandshakeHandler,但是我無法從方法determinUser中獲取該用戶名,我從DefaultHandshakeHandler重寫了該用戶名。在春天訪問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

但是如果想通過連接標頭髮送用戶名,可以在ChannelInterceptor中獲取它,如this answer中所述。