websocket over spring4 и весенняя безопасность SockJS / info? t =

1

Я пытаюсь использовать websocket весной для отправки и получения некоторых строк. Я работал с примером над Google, но после того, как все вместе, я получаю запрос к URL-адресу, который недоступен в моем запросе contorller.

поток /websocket/add/info? t = 1540813753999

Мой контроллер выглядит так:

 @Controller("webSocketController") @RequestMapping("/websocket")
 public class WebSocketController {

    @MessageMapping("/add" )
     @SendTo("/topic/showResult")
     public Result addNum(CalcInput input) throws Exception {
        Thread.sleep(2000);
         Result result = new Result(input.getNum1()+"+"+input.getNum2()+"="+(input.getNum1()+input.getNum2()));

         return result;
     }

    @RequestMapping("/start")
     public String start() {
        return "start";
    }    }

а также

@Configuration
@EnableWebSocketMessageBroker
public class AppWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/calcApp");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/add").setAllowedOrigins("*").withSockJS();
    }

}

Часть Javascript:

<s:url value="/flow/websocket/add" var="sockendpoint" htmlEscape="true" />
<s:url value="/flow/websocket/topic/showResult" var="showresult" htmlEscape="true" />
<s:url value="/flow/websocket/calcApp/add" var="calcApp" htmlEscape="true" />


<script type="text/javascript">
        var stompClient = null;

        function setConnected(connected) {
            document.getElementById('connect').disabled = connected;
            document.getElementById('disconnect').disabled = !connected;
            document.getElementById('calculationDiv').style.visibility = connected ? 'visible'
                    : 'hidden';
            document.getElementById('calResponse').innerHTML = '';
        }

        function connect() {
            var socket = new SockJS('${sockendpoint}');
            //var socket = new WebSocket('${sockendpoint}');
            stompClient = Stomp.over(socket);
            stompClient.connect({}, function(frame) {
                setConnected(true);
                console.log('Connected: ' + frame);
                stompClient.subscribe('${showresult}', function(calResult) {
                    showResult(JSON.parse(calResult.body).result);
                });
            }, function(error) {
                console.log(error);
            });
        }

        function disconnect() {
            stompClient.disconnect();
            setConnected(false);
            console.log("Disconnected");
        }

        function sendNum() {
            var num1 = document.getElementById('num1').value;
            var num2 = document.getElementById('num2').value;
            stompClient.send("${calcApp}", {}, JSON.stringify({
                'num1' : num1,
                'num2' : num2
            }));
        }

        function showResult(message) {
            var response = document.getElementById('calResponse');
            var p = document.createElement('p');
            p.style.wordWrap = 'break-word';
            p.appendChild(document.createTextNode(message));
            response.appendChild(p);
        }
    </script>

/flow - основное отображение весны на диспетчере

заранее спасибо

  • 0
    Теперь я понимаю проблему. Кажется, проблема связана с указанными вами путями, а не с конечной точкой информации. Также не стоит расширять абстрактный конфигуратор. Вы должны использовать конкретный. Я только что проснулся, поэтому, пожалуйста, дайте мне час, и я перепишу ответ. А пока вы можете проверить: spring.io/guides/gs/messaging-stomp-websocket
  • 0
    Вы зарегистрировали / добавили в качестве конечной точки для своего сервера STOMP, но указали в своем клиенте: "/ flow / websocket / add". Пожалуйста, измените его на / flow / add. Это должно делать свое дело. <s: url value = "/ flow / add" var = "sockendpoint" htmlEscape = "true" />. Дайте мне знать, если это работает, и я обновлю ответ с указанием причины этого.
Показать ещё 2 комментария
Теги:
spring
websocket

1 ответ

1
Лучший ответ

Конечная точка "info" автоматически добавляется SockJS, поскольку она является частью ее протокола.

Это совершенно нормально, и конечная точка используется клиентом для получения информации о функциях сервера.

Кроме того, AFAIK вы не можете избежать этого, поскольку он указан как часть протокола, таким образом, обязательным.

Пожалуйста, обратитесь к документации весны. Ссылка ниже:

https://docs.spring.io/spring/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/websocket.html

Раздел 22.3.1 Обзор SockJS, который объясняет причину конечной точки.


EDIT: Реальная проблема не связана с конечной точкой "info", которая автоматически добавляется каркасом.

Проблема заключается в том, что клиент вызывал конечную точку сервера STOMP в servlet/app/stompEndpoint в следующей строке: <s:url value="/flow/websocket/add" var="sockendpoint" htmlEscape="true"/>

Конечная точка/добавление стоп-сервера не является частью самого приложения, так как сервер может содержать фактически несколько приложений. Итак, правильный путь должен быть сервлет /stompEndpoint.

<s:url value="/flow/add" var="sockendpoint" htmlEscape="true"/>

Кроме того, вы можете проверить следующий пример Hello World, который объясняет это более подробно: https://spring.io/guides/gs/messaging-stomp-websocket/

  • 0
    нет примера от начала до конца? также реализовать параметр / info?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню