1

我一直在关注http-kit websockets 示例,后来在试图找到一种将 WS 通道映射到后端用户的惯用方法时陷入困境。

我尝试使用 Java 反射检查 org.httpkit.server.AsyncChannel 对象并获得以下属性:

|                           :name |         :return-type |                :declaring-class |                                               :parameter-types |      :exception-types |              :flags |
|---------------------------------+----------------------+---------------------------------+----------------------------------------------------------------+-----------------------+---------------------|
|                       chunkSize |  java.nio.ByteBuffer | org.httpkit.server.AsyncChannel |                                                          [int] |                    [] | #{:private :static} |
|                      firstWrite |                 void | org.httpkit.server.AsyncChannel |                                     [java.lang.Object boolean] | [java.io.IOException] |         #{:private} |
|                        isClosed |              boolean | org.httpkit.server.AsyncChannel |                                                             [] |                    [] |          #{:public} |
|                     isWebSocket |              boolean | org.httpkit.server.AsyncChannel |                                                             [] |                    [] |          #{:public} |
|                 messageReceived |                 void | org.httpkit.server.AsyncChannel |                                             [java.lang.Object] |                    [] |          #{:public} |
|                         onClose |                 void | org.httpkit.server.AsyncChannel |                                                          [int] |                    [] |          #{:public} |
| org.httpkit.server.AsyncChannel |                      | org.httpkit.server.AsyncChannel | [java.nio.channels.SelectionKey org.httpkit.server.HttpServer] |                    [] |          #{:public} |
|                    pingReceived |                 void | org.httpkit.server.AsyncChannel |                                                       [byte<>] |                    [] |          #{:public} |
|                        readable | clojure.lang.Keyword | org.httpkit.server.AsyncChannel |                                                          [int] |                    [] | #{:private :static} |
|                           reset |                 void | org.httpkit.server.AsyncChannel |                               [org.httpkit.server.HttpRequest] |                    [] |          #{:public} |
|                            send |              boolean | org.httpkit.server.AsyncChannel |                                     [java.lang.Object boolean] | [java.io.IOException] |          #{:public} |
|                   sendHandshake |                 void | org.httpkit.server.AsyncChannel |                                                [java.util.Map] |                    [] |          #{:public} |
|                     serverClose |              boolean | org.httpkit.server.AsyncChannel |                                                          [int] |                    [] |          #{:public} |
|                 setCloseHandler |                 void | org.httpkit.server.AsyncChannel |                                             [clojure.lang.IFn] |                    [] |          #{:public} |
|                  setPingHandler |                 void | org.httpkit.server.AsyncChannel |                                             [clojure.lang.IFn] |                    [] |          #{:public} |
|               setReceiveHandler |                 void | org.httpkit.server.AsyncChannel |                                             [clojure.lang.IFn] |                    [] |          #{:public} |
|                        toString |     java.lang.String | org.httpkit.server.AsyncChannel |                                                             [] |                    [] |          #{:public} |
|                      writeChunk |                 void | org.httpkit.server.AsyncChannel |                                     [java.lang.Object boolean] | [java.io.IOException] |         #{:private} |
nil

它似乎不包含任何明确的标识符,包括.toString

user=> (.toString ch)
"/0:0:0:0:0:0:0:1:3000<->/0:0:0:0:0:0:0:1:54538"

我能想到的唯一想法是:

1)保持connect!功能不变:

(defonce channels (atom #{}))

(defn connect! [channel]
  (log/info "channel open" channel)
  (swap! channels conj channel))

2) 更新 WebSocket 客户端以在建立 WS 连接后立即发送 JWT 或环会话 ID 作为第一条消息,该连接允许将该(已经建立的)通道映射到可以识别用户的标识符(JWT 或环会话 ID)。

这有意义吗?或者它是一个大的反模式和对 WS RFC 的违反?抱歉,我之前没有在这么低的级别上使用过 WebSockets。

4

0 回答 0