2017-04-21 87 views
1

我已根據堆棧溢出跟蹤Quetion1Quetion2,以根據會話標識發送消息給特定客戶端,但無法找到成功消息。春季會議+春季網絡插座。根據會話ID向特定客戶端發送消息

下面是我的樣品RestController類

@RestController 
public class SpringSessionTestApi { 

@Autowired 
public SimpMessageSendingOperations messagingTemplate; 

@MessageMapping("/messages") 
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception { 

    String sessionId = (String) headerAccessor.getSessionAttributes().get("SPRING.SESSION.ID"); 
    messagingTemplate.convertAndSendToUser(sessionId,"/queue/test",message, createHeaders(sessionId)); 

    } 

private MessageHeaders createHeaders(String sessionId) { 
    SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE); 
    headerAccessor.setSessionId(sessionId); 
    headerAccessor.setLeaveMutable(true); 
    return headerAccessor.getMessageHeaders(); 
    } 
} 

會話ID:當客戶端發送了createSession請求,新的彈簧的sessionId產生並同樣被儲存在MongoDB的爲好。之後,當客戶端發送Web套接字連接請求時,會收到相同的sessionId,並按預期存儲在mongoDb中。直到這一切工作正常。

現在我的工作是根據sessionId將響應發送回客戶端。 對於我有以下的網絡套接字類:

@Configuration 
@EnableScheduling 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends 
    AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> { 

@Override 
protected void configureStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/messages"); 
} 

public void configureMessageBroker(MessageBrokerRegistry registry) { 
    registry.enableSimpleBroker("/queue"); 
    registry.setApplicationDestinationPrefixes("/app"); 
    } 
} 

和我使用的連接樣本客戶端代碼:

function connect() { 

stompClient = Stomp.client('ws://localhost:8016/messages'); 
stompClient.debug = null; 

stompClient.connect({}, function (frame) { 
    setConnected(true); 
    console.log('Connected: ' + frame); 
    stompClient.subscribe('/user/queue/test', function (greeting) { 
     console.log("Hello "+greeting); 
     console.log("Greeting body "+JSON.parse(greeting.body)); 

    }); 
}); 
} 

請幫幫忙,我哪裏做錯了在這? 在此先感謝!

+0

我只看到配置,看不到應該向用戶發送響應的類 – Sarief

+0

@Sarief據我所知,「convertAndSendToUser()」方法會向特定用戶發送響應。對不起,我不明白你在問什麼? – Akshada

+0

hm。沒有看到它。你需要使用用戶名,而不是會話ID。它使用spring安全並通過Authority.class的用戶名查找用戶。這就是說,你的用戶堅持春季安全嗎? – Sarief

回答

0

如果您正在使用/ user頻道,請嘗試按照here的規定傳遞用戶。

@MessageMapping("/messages") 
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor, Principal principal) 
    throws Exception { 
    messagingTemplate.convertAndSendToUser(principal.getName(), "/queue/test", message); 
} 
+0

thanx你的答覆。我認爲principal.getName()會爲我提供在認證過程中由spring security設置的用戶名。在我的情況下,沒有認證。我只是想根據它通過headerAccessor.getSessionAttributes()。get(「SPRING.SESSION.ID」)獲得的sessionId來回復客戶端。 – Akshada