Как достать sessionId из вебсокета SockJS?

Итак, вам понадобилось получить сгенерированный при конструировании вебсокета идентификатор сессии. Неспешное гугление выдало такое обсуждение: stackoverflow.com. Однако, socket.sessionId оказывается undefined (версия SockJS 0.3.4). Но не всё потеряно.

Способ достать идентификатор есть — регулярные выражения, он написан в обсуждении на stackoverflow:

var url = socket._transport.url; // "http://localhost:8080/user/482/0bb13347/websocket"
var result = url.match(/.*\/([^\/]*)\/websocket$/);
alert(result[1]); //sessionid

Как оказывается, нет способа передать в конструктор параметр с желаемым значением идентификатора сессии. А если надо получить для совместимости в идентификаторе не строку из 8 случайных символов, а uuid? Насколько я понял, ванильный SockJS уже не сработает.

Обследуем исходник sockjs-0.3.4.js. В функции SockJS.prototype._try_next_protocol = function(close_event) {} есть единственное упоминание переменной $connid, которая становится частью URL, эта переменная не покидает области видимости этой функции. Если бы в коде был оператор:

that.sessionId = connid;

, то можно было бы достать идентификатор как socket.sessionId.

Для того, чтобы присвоить идентификатору сессии случайный uid, потребуется такой патч (добавлены функции guid() и s4()):

+function guid() {
+	  return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
+	    s4() + '-' + s4() + s4() + s4();
+	}
+
+function s4() {
+	  return Math.floor((1 + Math.random()) * 0x10000)
+	    .toString(16)
+	    .substring(1);
+}
 
                    that._didClose(2007, "Transport timeouted");
                }
            });
 
-            var connid = utils.random_string(8);
+            var connid = guid();
            var trans_url = that._base_url + '/' + that._server + '/' + connid;
            that._debug('Opening transport:', protocol, ' url:'+trans_url,
                        ' RTO:'+that._options.rto);
+            that.sessionId = connid;
You can leave a response, or trackback from your own site.

Leave a Reply