로그인하지 않고 스프링 웹 소켓@센드투저?
-
02-01-2020 - |
문제
나는 웹 소켓 기능을 가진 간단한 스프링 응용 프로그램을 가지고 있으며 모든 것이 지금까지 작동합니다.이제@송신 사용자 주석을 사용하여 내 서버에서 특정 클라이언트로 메시지를 보내고 싶습니다.이것은"메시지 무시,사용 가능한 주요 정보 없음"오류를 제공합니다.나는 내 서버에 로그인이 전혀 없다는 것을 이해하므로 모든 사용자는"익명"이며 주체가 없습니다(지금은 스프링 보안을 사용하지 않습니다).그러나 모든 사용자는 세션 아이디를 가지고 있습니다.어떻게 든 세션 아이디를 사용하여 사용자를 차별화 할 수 있습니까?내 사용자가 세션 아이디에 해당하는 주체를 얻을 수 있도록 어떻게 달성 할 수 있습니까?
해결책
솔루션이 @SendToUser
를 사용하지 않고 원시 SimpMessagingTemplate
를 사용하고 열려있는 세션을 제어하는 대상으로 메시지를 보낼 수 있습니다.
.새로운 WebSocket 세션에 대해 ID가 약간의 ID가 있음을 가정하면 큐 이름에 해당 식별자가있는 대기열에 가입 할 수 있습니다.
stomp.subscribe("/queue/chats" + "-" + mycustomidentifier, onmessage);
.
이제 Spring WebSocket 수신기 측면에서 SimpMessagingTemplate
를 사용하여 응답을 지시 할 수 있습니다.
@Controller
public class MyController {
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
@MessageMapping("/chats")
public void handleChat(@Payload ChatMessage message) {
this.simpMessagingTemplate.convertAndSend("/queue/chats-" + "mycustomidentifier", "[" + getTimestamp() + "]:" + message.getMessage());
}
....
. 다른 팁
사용 @SendToUser
구독 할 때 큐 앞에"/사용자/"를 추가하십시오(구독자 측만 해당).나머지는 마법을 작동:-)
대신
Java Server: @SendTo("/topic/showResult")
그리고
JS Client: stompClient.subscribe('/topic/showResult', function(calResult){ ....
사용:
Java Server: @SentToUser("/topic/showResult")
그리고
JS Client: stompClient.subscribe('/user/topic/showResult', function(calResult){ ....
STOMP 생성 세션 ID (감사,
SpringFramework 클라이언트 :
private SimpMessagingTemplate template;
@Autowired
public GreetingController(SimpMessagingTemplate template) {
this.template = template;
}
@MessageMapping("/hello")
public void greeting(HelloMessage message, @Header("simpSessionId") String sessionId) throws Exception {
template.convertAndSend("/queue/greeting-"+sessionId, new Greeting("Hello, " + message.getName()));
}
.
자바 스크립트 클라이언트 :
function connect() {
var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
var sessionId = /\/([^\/]+)\/websocket/.exec(socket._transport.url)[1];
console.log("connected, session id: " + sessionId);
stompClient.subscribe('/queue/greeting-'+sessionId, function (greeting) {
showGreeting(JSON.parse(greeting.body).content);
});
});
}
.
스톰프 세션 ID 대신 웹 컨테이너의 세션 ID (예 : jsessionID)를 사용할 수 있지만 이제 쿠키는 기본값으로 액세스 할 수 없음JavaScript에서 (Tomcat 용) 이것은 더 어려운 전망입니다.
이것을 시도하십시오.그것은 나에게 일했습니다
@Autowired
private SimpMessagingTemplate messagingTemplate;
@MessageMapping("/getHello")
public void sendReply( MessageHeaders messageHeaders, @Payload String message, @Header(name = "simpSessionId") String sessionId){
messagingTemplate.convertAndSendToUser(sessionId, "/queue/hello", "Hello "+ message, messageHeaders);
}
.