使用 sockjs 和 stomp 进行 /info 请求期间没有 cookie

Tim*_*osh 5 javascript stomp spring-security sockjs spring-websocket

我正在尝试将 Spring Security 与 websockets 一起使用。作为示例,我正在使用“深入研究 websockets”演讲中的spring-websocket-chat ( https://github.com/salmar/spring-websocket-chat ) \xe2\x80\x94 演示应用程序。在该应用程序中,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。这是我的代码

\n\n
$connectButton.click(function () {\n    var serverHost = $host.val();\n    console.log("sockjs created");\n    stomp = Stomp.over(new SockJS(serverHost));\n    console.log("stomp over");\n    stomp.connect({},\n        function () {\n            console.log("connected");\n        },\n        function () {\n            console.log("error");\n        })\n    console.log("pressed");\n});\n
Run Code Online (Sandbox Code Playgroud)\n

小智 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
  });
Run Code Online (Sandbox Code Playgroud)

现在所有与w​​ebsocket相关的请求都会有参数“?token=AAA”

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

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

然后使用 Spring,您可以设置一些过滤器,它将使用提供的令牌来识别会话。

当 UI 和服务器同源时,PS cookie 会自动获取。