繁体   English   中英

websocket over spring4 和 spring security SockJS /info?t=

[英]websocket over spring4 and spring security SockJS /info?t=

我正在尝试在 spring 上使用 websocket 来发送和接收一些字符串。 我曾经在 google 上使用过一个示例,但是在将所有内容放在一起后,我收到了一个请求,该请求指向一个在我的控制器请求中不可用的 url。

flow/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是调度器上 spring 的主要映射

先感谢您

“信息”端点由 SockJS 自动添加,因为它是其协议的一部分。

这是完全正常的,客户端使用端点来检索有关服务器功能的信息。

此外,AFAIK 您无法避免它,因为它被指定为协议的一部分,因此是强制性的。

请参阅Spring 文档 下方链接:

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

第 22.3.1 节 SockJS 概述,解释了端点背后的原因。


编辑:真正的问题与框架自动添加的“信息”端点无关。

问题是客户端在以下行中调用servlet/app/stompEndpoint 上的 STOMP 服务器端点: <s:url value="/flow/websocket/add" var="sockendpoint" htmlEscape="true" />

stomp 服务器端点 /add 不是应用程序本身的一部分,因为服务器实际上可以包含多个应用程序。 所以,正确的路径应该是 servlet/stompEndpoint。

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

此外,您可以查看以下 Hello World 示例,它以更详细的方式解释了这一点: https : //spring.io/guides/gs/messaging-stomp-websocket/

这是因为 /info=34424 的问题 - 有 404 错误 - 我不得不放弃它。 我的项目中有 Spring 4.2,许多 SockJS Stomp 实现通常与 Spring Boot 实现配合良好。 Baeldung 的这个实现有效(对我来说没有从 Spring 4.2 更改为 5)。 使用了他博客中提到的依赖后,还是给了我ClassNotFoundError。 我添加了以下依赖项来修复它。

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>

Baeldung 的实现奇怪地没有进行任何此类调用

flow/websocket/add/info?t=1540813753999

它的作用(发送和接收)如下。 我只是粘贴它,以防精通这些库的人可以进一步在此论坛上添加见解。

 >>> SEND
destination:/app/chat
content-length:38

{"from":"nicholas","text":"try again"}

<<< MESSAGE
destination:/topic/messages
content-type:application/json;charset=UTF-8
subscription:sub-0
message-id:m3p096zk-11
content-length:53

{"from":"nicholas","text":"try again","time":"13:46"}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM