Spring Stomp @SendToUser с неаутентифицированным пользователем не работает

Я пытаюсь ответить пользователю, не прошедшему проверку подлинности, с помощью @SendToUser.

  • Весна 4.1.1

Я использую недавно созданное приложение Spring Boot, и единственная конфигурация, которая у меня есть:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/stomp").withSockJS();
    }
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
        registry.setUserDestinationPrefix("/user"); 
    }
}

Код контроллера:

@MessageMapping("/search")
@SendToUser("/search")
public String search(@Payload String xxx) {
    return "TEST1234";
}

JS:

var socket = new SockJS('/webapp/stomp');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
    stompClient.subscribe('/user/search', function(data){
        alert(data.body);
    });
});

Выход пружины:

DEBUG  org.springframework.web.servlet.DispatcherServlet: 996 - Successfully completed request
DEBUG   o.s.w.s.handler.LoggingWebSocketHandlerDecorator:  45 - New WebSocketServerSockJsSession[id=shizav88]
DEBUG       o.s.m.simp.broker.SimpleBrokerMessageHandler: 158 - Processing CONNECT session=shizav88
DEBUG      o.s.m.simp.user.UserDestinationMessageHandler: 187 - Translated /user/search -> [/search-usershizav88]

JS:

var name = document.getElementById('name').value;
stompClient.send("/app/search", {}, "test"));

Выход пружины:

DEBUG     o.s.m.s.a.s.SimpAnnotationMethodMessageHandler: 348 - Searching methods to handle SEND /app/search session=shizav88
DEBUG     o.s.m.s.a.s.SimpAnnotationMethodMessageHandler: 446 - Invoking de.benneq.next.search.SearchController#search[1 args]
DEBUG   o.s.b.factory.support.DefaultListableBeanFactory: 247 - Returning cached instance of singleton bean 'searchController'
DEBUG      o.s.m.simp.user.UserDestinationMessageHandler: 187 - Translated /user/shizav88/search -> [/search-usershizav88]

Мне кажется, что Spring сопоставляет подписку с /search-usershizav88. А затем использует /search-usershizav88 для отправки ответа. Но мой JS-клиент ничего не получает.

В чем проблема?


person Benjamin M    schedule 09.10.2014    source источник


Ответы (2)


Теперь у меня все работает, но я действительно не знаю, ПОЧЕМУ:

Конфигурация:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/stomp").withSockJS();
    }
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/queue", "/topic"); // <- added "/queue"
        registry.setApplicationDestinationPrefixes("/app");
        registry.setUserDestinationPrefix("/user"); 
    }
}

Контроллер:

@MessageMapping("/search")
@SendToUser // <- maps to "/user/queue/search"
public String search(@Payload String xxx) {
    return "TEST1234";
}

JS:

stompClient.subscribe('/user/queue/search', function(data){
    alert(data.body);
});

Выход пружины:

DEBUG  org.springframework.web.servlet.DispatcherServlet: 996 - Successfully completed request
DEBUG   o.s.w.s.handler.LoggingWebSocketHandlerDecorator:  45 - New WebSocketServerSockJsSession[id=fkbmnpkj]
DEBUG       o.s.m.simp.broker.SimpleBrokerMessageHandler: 158 - Processing CONNECT session=fkbmnpkj
DEBUG      o.s.m.simp.user.UserDestinationMessageHandler: 187 - Translated /user/queue/search -> [/queue/search-userfkbmnpkj]
DEBUG       o.s.m.simp.broker.SimpleBrokerMessageHandler: 175 - Processing SUBSCRIBE /queue/search-userfkbmnpkj id=sub-0 session=fkbmnpkj

Теперь в журнале есть дополнительная строка, в которой говорится, что это Processing SUBSCRIBE /queue/search-userfkbmnpkj id=sub-0 session=fkbmnpkj

Этого не хватало раньше.

Было бы неплохо, если бы кто-нибудь мог объяснить, почему мне нужно отображение /queue, чтобы это работало правильно.

person Benjamin M    schedule 09.10.2014
comment
Что делает UserDestinationResolver, так это удаление префикса «/user». Затем, в нерабочем случае, пункт назначения был '/search/{'user'+userSessionId}', но '/search' отфильтровывается, потому что там не был включен simpleBroker. - person Mert Mertce; 01.04.2015
comment
спасибо, что указали мне на добавление /queue сюда registry.enableSimpleBroker("/queue", "/topic"); // <- added "/queue" - person Shantaram Tupe; 02.12.2017
comment
Как вы включили весь этот вывод отладки - моя весна не публикует много - person Jeef; 04.04.2018

В первом сообщении вы подписываетесь на "/user/search". Во втором "/user/queue/search". Я проверил "/user/topic/search", и это тоже работает. Таким образом, решение состоит в том, чтобы использовать действительное имя темы. Никакой магии...

person Igor Cherepov    schedule 19.12.2014