Итак, вам понадобилось получить сгенерированный при конструировании вебсокета идентификатор сессии. Неспешное гугление выдало такое обсуждение: 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; |