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

在进行跨域请求时,如何使用 SockJS 和 STOMP 添加 Spring Security JSESSIONID?

Stomp SockJs 客户端 + 服务器 Spring

Spring WebSocket 使用 SockJS 连接到不同的域