Javascript spring4上的websocket和spring安全套接字js/info?t=
我正在尝试通过spring使用websocket发送和接收一些字符串。我曾经在谷歌上做过一个例子,但在把所有这些放在一起之后,我收到了一个url请求,而这个url在我的控制请求中是不可用的 flow/websocket/add/信息?t=1540813753999 我的控制器如下所示: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 {
@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"}