Spring WebSocket convertAndSendToUser не работает - PullRequest
1 голос
/ 10 марта 2020

Я пытаюсь отправить сообщения определенным c пользователям. Я не могу использовать аннотацию @SendToUser, потому что в моем приложении сообщение, которое будет отправлено через сокет, будет приходить из другой службы, а не из пользовательского интерфейса. Поэтому я управляю отображением сеанса и пользователя. Я перепробовал все возможные комбинации URL, которые я нашел в inte rnet. Я не могу найти проблему. Код показан ниже.

WebSocketConfig. java

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/user/queue/specific-user");
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").withSockJS()
                .setInterceptors(new HttpHandshakeInterceptor(this.socketStore()));
    }

HttpHandshakeInterceptor. java

public class HttpHandshakeInterceptor implements HandshakeInterceptor{

    private SocketStore socketStore;


    public HttpHandshakeInterceptor(SocketStore socketStore) {
        this.socketStore = socketStore;
    }

    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
            Map<String, Object> attributes) throws Exception {
        if(request instanceof ServletServerHttpRequest)
        {
            ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
            String abc = servletRequest.getServletRequest().getHeader("token");
            HttpSession session = servletRequest.getServletRequest().getSession();
        }
        return true;
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
            Exception exception) {
        // TODO Auto-generated method stub

    }
}

GreetingController. java

@Controller
public class GreetingController {

    @Autowired
    private SocketStore socketStore;

    @Autowired
    private SimpMessageSendingOperations messagingTemplate;


    @MessageMapping("/hello")
    public void processMessageFromClient(HelloMessage message, SimpMessageHeaderAccessor headerAccessor,
            @Header("simpSessionId") String sessionId2) throws Exception {
        String sessionId = headerAccessor.getSessionAttributes().get("sessionId").toString();
        messagingTemplate.convertAndSendToUser(sessionId, "/queue/specific-user",new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!"), createHeaders(sessionId));


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

}

приложение. js

var stompClient = null;

function setConnected(connected) {
    $("#connect").prop("disabled", connected);
    $("#disconnect").prop("disabled", !connected);
    if (connected) {
        $("#conversation").show();
    }
    else {
        $("#conversation").hide();
    }
    $("#greetings").html("");
}

function connect() {
    var socket = new SockJS('/gs-guide-websocket');
    stompClient = Stomp.over(socket);
    var random = Math.floor(Math.random() * 11);
    stompClient.connect({'token':random}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/user/queue/specific-user', function (greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

function disconnect() {
    if (stompClient !== null) {
        stompClient.disconnect();
    }
    setConnected(false);
    console.log("Disconnected");
}

function sendName() {
    stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
}

function showGreeting(message) {
    $("#greetings").append("<tr><td>" + message + "</td></tr>");
}

$(function () {
    $("form").on('submit', function (e) {
        e.preventDefault();
    });
    $( "#connect" ).click(function() { connect(); });
    $( "#disconnect" ).click(function() { disconnect(); });
    $( "#send" ).click(function() { sendName(); });
});
...