Javascript spring4上的websocket和spring安全套接字js/info?t=

Javascript spring4上的websocket和spring安全套接字js/info?t=,javascript,java,spring,websocket,Javascript,Java,Spring,Websocket,我正在尝试通过spring使用websocket发送和接收一些字符串。我曾经在谷歌上做过一个例子,但在把所有这些放在一起之后,我收到了一个url请求,而这个url在我的控制请求中是不可用的 flow/websocket/add/信息?t=1540813753999 我的控制器如下所示: @Controller("webSocketController") @RequestMapping("/websocket") public class WebSocketController {

我正在尝试通过spring使用websocket发送和接收一些字符串。我曾经在谷歌上做过一个例子,但在把所有这些放在一起之后,我收到了一个url请求,而这个url在我的控制请求中是不可用的

flow/websocket/add/信息?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";
    }    }

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>

var stompClient=null;
功能设置已连接(已连接){
document.getElementById('connect')。disabled=connected;
document.getElementById('disconnect')。disabled=!connected;
document.getElementById('calculationDiv')。style.visibility=connected?'visible'
:“隐藏的”;
document.getElementById('calResponse')。innerHTML='';
}
函数连接(){
var socket=new SockJS('${socketendpoint}');
//var socket=newwebsocket('${socketendpoint}');
stompClient=Stomp.over(套接字);
stompClient.connect({},函数(框架){
setConnected(true);
console.log('Connected:'+frame);
stompClient.subscribe('${showresult}',函数(calResult){
showResult(JSON.parse(calResult.body.result);
});
},函数(错误){
console.log(错误);
});
}
功能断开(){
stompClient.disconnect();
设置连接(假);
控制台日志(“断开”);
}
函数sendNum(){
var num1=document.getElementById('num1')。值;
var num2=document.getElementById('num2')。值;
发送(“${calcApp}”,{},JSON.stringify({
“num1”:num1,
“num2”:num2
}));
}
函数showResult(消息){
var response=document.getElementById('calResponse');
var p=document.createElement('p');
p、 style.wordWrap='break word';
p、 appendChild(document.createTextNode(message));
反应。儿童(p);
}
/flow是dispatcher上spring的主要映射

提前感谢

SockJS会自动添加“info”端点,因为它是其协议的一部分

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

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

请参阅Spring文档
。链接如下:

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


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

问题在于,客户端在以下行中调用servlet/app/stompEndpoint处的STOMP服务器端点:

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


另外,您可以查看以下Hello World示例,该示例以更详细的方式解释了这一点:

因为/info=34424的问题(404错误),我不得不放弃它。我的项目中有Spring 4.2,许多SockJS Stomp实现通常与Spring引导实现配合使用。工作(对于我来说,没有从Spring 4.2更改为Spring 5)。在使用了他博客中提到的依赖项之后,它仍然给了我ClassNotFoundError。我添加了下面的依赖项来修复它

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
它的功能(发送和接收)如下所示。我只是粘贴它,以防熟悉这些库的人可以在这个论坛上进一步添加见解

 >>> 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"}
>>发送
目的地:/app/聊天室
内容长度:38
{“from”:“nicholas”,“text”:“重试”}

从头到尾都没有例子?还要实现/info参数吗?我现在理解了这个问题。问题似乎出在您注释的路径上,而不是在info端点上。此外,您不应该扩展抽象配置器。你应该用混凝土的。我刚醒,请给我一个小时,我会重新写答案。同时,您可以检查:您已注册/添加为STOMP服务器的端点,但在客户端中指定了:“/flow/websocket/add”。请将其更改为/flow/add。那就行了。让我知道它是否有效,我会更新它背后的原因的答案。非常好,正在工作,我现在明白了,谢谢你的帮助很高兴听到这个!我对答案进行了编辑,添加了一些额外的细节。如果它对您有帮助,请将其标记为“已回答”。谢谢
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"}