Spring 和 SockJs 的控制器组件问题
Posted
技术标签:
【中文标题】Spring 和 SockJs 的控制器组件问题【英文标题】:Controller component issue with Spring and SockJs 【发布时间】:2016-04-06 08:37:01 【问题描述】:我在使用 Spring 和 SockJs 配置 WebSocket 时遇到问题。
我已经配置了我所有的应用程序,比如 Spring 文档,连接似乎很好,但是当我发送消息时,控制器从不涉及并且它不起作用。
这是配置组件:
@Configuration
@EnableWebMvc
@EnableWebSocketMessageBroker
public class MyWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer implements WebSocketConfigurer
@Override
public void registerStompEndpoints(StompEndpointRegistry registry)
registry.addEndpoint("/mySocket").withSockJS().setInterceptors(new MySocketHandshakeInterceptor());;
@Override
public void configureMessageBroker(MessageBrokerRegistry registry)
registry.setApplicationDestinationPrefixes("/app").enableSimpleBroker("/topic");
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry)
这是 HandshakeInterceptor 的实现:
public class MySocketHandshakeInterceptor implements HandshakeInterceptor
@Override
public void afterHandshake(ServerHttpRequest paramServerHttpRequest, ServerHttpResponse paramServerHttpResponse, WebSocketHandler paramWebSocketHandler, Exception paramException)
// TODO Auto-generated method stub
System.out.println("MySocketHandshakeInterceptor afterHandshake");
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> paramMap)
throws Exception
System.out.println("MySocketHandshakeInterceptor beforeHandshake");
return true;
这是控制器组件:
@Controller
public class MySocketController
@MessageMapping("/testsocket")
@SendTo("/topic/testresponse")
public MessageOut test(MessageIn message) throws Exception
System.out.println("MySocketController start");
System.out.println("MySocketController test "+ message);
return new MessageOut("test OK");
这些是 MessageIn 和 MessageOut:
public class MessageIn
private String test;
/**
* @return the test
*/
public String getTest()
return test;
public class MessageOut
private String result;
public MessageOut(String result)
super();
this.result = result;
/**
* @return the test
*/
public String getResult()
return result;
/**
* @param result the result to set
*/
public void setResult(String result)
this.result = result;
最后,这是客户端(javascript):
var socketSession = ;
connectToMySocket();
function connectToVideoSocket()
socketSession.socket = new SockJS("/mySocket");
socketSession.socket.stomp = Stomp.over(socketSession.socket);
socketSession.socket.stomp.debug = null;
socketSession.socket.stomp.connect(, function ()
socketSession.socket.stomp.subscribe("/topic/testresponse", function (data)
console.log(data);
);
);
这是我为测试套接字而启动的命令:
socketSession.socket.stomp.send("app/testsocket", , JSON.stringify('test': 'test'));
在系统输出控制台中我只能看到两行:
MySocketHandshakeInterceptor beforeHandshake
MySocketHandshakeInterceptor afterHandshake
拦截器工作正常,但我看不到控制器组件的任何打印。
怎么了? 谢谢。
【问题讨论】:
【参考方案1】:我自己解决了。
这是客户端的问题。
正确的脚本是:
var mySocket = undefined;
var stompClient = undefined;
connectToVideoSocket();
function connectToVideoSocket()
mySocket = new SockJS('/mySocket');
stompClient = Stomp.over(mySocket);
stompClient.debug = null;
stompClient.connect(, function(frame)
stompClient.subscribe('/topic/testresponse', function(data)
console.log(JSON.parse(data.body).result);
);
);
这样就可以正常工作了。
【讨论】:
以上是关于Spring 和 SockJs 的控制器组件问题的主要内容,如果未能解决你的问题,请参考以下文章
带有 Sockjs 和 Spring 4 但没有 Stomp 的 WebSocket
Spring(Websockets / REST / Security)、JWT 和 Sockjs(Stomp)集成
Spring with STOMP over SockJS 和 Tomcat 未升级到 Websockets