문제

나는 웹 소켓 기능을 가진 간단한 스프링 응용 프로그램을 가지고 있으며 모든 것이 지금까지 작동합니다.이제@송신 사용자 주석을 사용하여 내 서버에서 특정 클라이언트로 메시지를 보내고 싶습니다.이것은"메시지 무시,사용 가능한 주요 정보 없음"오류를 제공합니다.나는 내 서버에 로그인이 전혀 없다는 것을 이해하므로 모든 사용자는"익명"이며 주체가 없습니다(지금은 스프링 보안을 사용하지 않습니다).그러나 모든 사용자는 세션 아이디를 가지고 있습니다.어떻게 든 세션 아이디를 사용하여 사용자를 차별화 할 수 있습니까?내 사용자가 세션 아이디에 해당하는 주체를 얻을 수 있도록 어떻게 달성 할 수 있습니까?

도움이 되었습니까?

해결책

솔루션이 @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 (감사, mariusz2108 유사한 질문에 대한 답변 에 대한 답변이 있습니다 ( Spring 의 정식 예제

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top