使用SockJS和Stomp进行/info请求时没有cookies

5

我正在尝试使用Spring Security与WebSockets。作为示例,我使用了spring-websocket-chat (https://github.com/salmar/spring-websocket-chat) — 这是一次关于“深入研究WebSockets”的演讲中的演示应用程序。在该应用程序中,使用CookieHttpSessionStrategy来存储会话ID,身份验证期间存储的cookie随着/info请求发送。下面是演示通过sockjs连接到服务器的代码(此请求会发送cookie)https://github.com/salmar/spring-websocket-chat/blob/master/src/main/webapp/js/services.js。我编写了自己的客户端,它使用sockjs和stomp,但在/info请求期间没有发送cookie。以下是我的代码:

$connectButton.click(function () {
    var serverHost = $host.val();
    console.log("sockjs created");
    stomp = Stomp.over(new SockJS(serverHost));
    console.log("stomp over");
    stomp.connect({},
        function () {
            console.log("connected");
        },
        function () {
            console.log("error");
        })
    console.log("pressed");
});
1个回答

2
据我所知,您无法将cookie传递给SockJS(尤其是由于同源策略的限制)。但是,在最新的SockJS 1.0.3版本中,您可以将查询参数作为连接URL的一部分进行传递。因此,您可以发送一些JWT令牌来授权会话。
  var socket = new SockJS('http://localhost/ws?token=AAA');
  var stompClient = Stomp.over(socket);
  stompClient.connect({}, function(frame) {
      stompClient.subscribe('/topic/echo', function(data) {
        // topic handler
      });
    }
  }, function(err) {
    // connection error
  });

现在所有与WebSocket相关的请求都将带有参数"?token=AAA"。

http://localhost/ws/info?token=AAA&t=1446482506843

http://localhost/ws/515/z45wjz24/websocket?token=AAA

然后,使用Spring可以设置一些过滤器,通过提供的令牌标识会话。

顺便说一句,当UI和服务器具有相同的源时,自动捕获cookie。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接