【问题标题】:No cookies during /info request using sockjs and stomp使用 sockjs 和 stomp 在 /info 请求期间没有 cookie
【发布时间】:2023-10-03 10:24:02
【问题描述】:

我正在尝试将 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");
});

【问题讨论】:

    标签: javascript spring-security stomp sockjs spring-websocket


    【解决方案1】:

    据我所知,您不能将 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 和服务器的来源相同时,会自动获取 PS cookie。

    【讨论】: