前端问题求助:SockJS 创建连接时传递权限认证信息

本贴最后更新于 580 天前,其中的信息可能已经事过景迁

官方示例

function connect()  {
  var socket =  new  SockJS('/gs-guide-websocket'); 
  stompClient =  Stomp.over(socket); 
  stompClient.connect({},  function  (frame)  { 
    setConnected(true); 
    console.log('Connected: '  + frame); 
    stompClient.subscribe('/topic/greetings',  function  (greeting)  { 
      showGreeting(JSON.parse(greeting.body).content);  
    });  
  });  
}

此示例的第一行 var socket = new SockJS('/gs-guide-websocket'); ,在我自己的程序中运行时会用 XHR 去请求 /gs-guide-websocket/info,但此请求需要认证信息,我想要设置此请求的请求头,比如 X-JWT-TOKEN,该怎样处理?


2018-12-12 更新:已解决

原因:后台问题,已修改支持通过 Query String Parameters 传递 token 进行授权认证。

标题:~~SockJS 创建连接时设置请求头 ~~ 替换为 SockJS 创建连接时传递权限认证信息

  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    41 引用 • 156 回帖 • 630 关注
  • SockJS

    SockJS 是一个浏览器上运行的 JavaScript 库,如果浏览器不支持 WebSocket,该库可以模拟对 WebSocket 的支持,实现浏览器和 Web 服务器之间低延迟、全双工、跨域的通讯通道。

    1 引用 • 15 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    212 引用 • 1326 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    1733 引用 • 11434 回帖 • 584 关注

赞助商 我要投放

被采纳的回答
15 回帖
请输入回帖内容 ...
  • iTanken

    我用到的是 sockjs/sockjs-client,但是并没有找到 new SockJS() 时设置请求头的示例,不知道能不能设置 😂

    1 回复
  • Vanessa

    第三个参数是 options, 你可以看一下。

    1 回复
  • iTanken

    试过了,不是设置请求头的

  • Vanessa

    网上说要这样 https://stackoverflow.com/questions/25486889/websocket-stomp-over-sockjs-http-custom-headers/39044121
    stompClient.connect({token: "ABC123"}, function(frame) { ... code ...});
    我没用过,黑客派是从 cookie 里面取的

    /gs-guide-websocket/info 这个和 WS 没关系的话,自己 AJAX 里面加头不可以么?

    1 回复
  • iTanken

    .connect() 的第一个参数,是在 new SockJS() 已经成功后,建立 WebSocket 连接时候设置请求头用的,
    然后那个 /ws/info 是在 new SockJS() 的过程中,执行 Stomp.over() 之前,SockJS 内部去请求的,这个好像是没有办法去设置请求头,只能通过 Cookie,
    但是 SockJS 请求 /info 的 Cookie 跟页面的 Cookie 不一致,不知道 SockJS 的 Cookie 是在哪自动生成的,也不知道怎么去修改 SockJS 请求 /info 时的 Cookie,好忧伤

  • iTanken

    https://stackoverrun.com/cn/q/7711415

    现在看只能是通过 ?token= 来认证,但是我这个 WebSocket 提供方好像目前还不支持通过 ?token= 来认证,因为就算这样传了,也一直返回 403

  • iTanken

    @Vanessa 现在看应该是他们后台有问题,虽然没有解决,但还是非常感谢 V 姐的回答了,Thanks❗

    1 回复
  • iTanken
    1 回复
  • Vanessa

    做的还不错。居然是这样解决的。我用的是 reconnectingwebsocket 可以使用浏览器的 cookie

    1 回复
  • iTanken

    哦哦,看来跟黑客派的 WebSocket 用的不一样,这边必须用 SockJS + Stomp-WebSocket,主要是因为用到了 stomp 的消息订阅 stompClient.subscribe(...)

    1 回复
  • Vanessa

    自己封装下 😂

  • 88250

    应该是后端的问题,如果是用的 javax.websocket 的话是可以配置连接握手的,会话、请求头以及参数都可以很方便地获取到:

    public static class WebSocketConfigurator extends ServerEndpointConfig.Configurator {
    
        @Override
        public void modifyHandshake(final ServerEndpointConfig config, final HandshakeRequest request, final HandshakeResponse response) {
            final HttpSession httpSession = (HttpSession) request.getHttpSession();
            final Map<String, List<String>> headers = request.getHeaders();
            final Map<String, List<String>> parameterMap = request.getParameterMap();
        }
    }
    
    1 回复
  • iTanken

    要是自己这样写应该是没问题,不过是一个第三方公司的后台接口,跟我说用 ?token= 的方式传 Token,我试过不行,他们后来也试了的确不行(自己都没试过就告诉我用这种方式,我也是醉了,一直在浪费时间),都快一周了,直到现在也没给我个确切答案 😂

    以我搜索到的信息了解到,SockJS 可能由于安全问题,好像不能设置请求头(也不允许去修改 Cookie),只能通过它自己生成的 Cookie 去认证,现在的问题就是不知道 SockJS 是在什么时候生成 Cookie 的,看源码没看出来,网上也没搜到,不允许修改让我能获取到也知足了 😭

请输入回帖内容 ...