clojure ringはwebappを神秘的にしない

2555 ワード

まず説明するのは、clojure ringは新しい思想ではなく、gitのトップページの説明によると、Python's WSGI and Ruby's Rackから思想を得たことだ.最近数週間clojureコードを書きましたが、clojure ringは本当に簡単すぎると思います(これは褒め言葉です)、思わず紹介してしまいました.
まずSPECを見てみましょう.https://github.com/ring-clojure/ring/blob/master/SPEC
まとめると、mapを受け取ってmapを返して、Handlerはこのことをします.
では、ミドルウェアは?handlerを包んで、handlerの前に何かをして、handlerの後に何かをします.
次に、ダミーのhandlerコードを示します.
;request   {:uri / :query-string "a=1"}

(defn ahandler [request]
    {:status 200 :body "hello"}
)

ミドルウェア(javaのfilterに相当)
(defn amiddleware [handler]
    (fn [request]
        (let [new-request (dosomething request)
              response (handler new-request)]
              ;    response    ,      。
       )))

ミドルウェアの役割ここでは上記の例を挙げますが、最終的にhandlerがquery-stringを直接使用するのは不便であれば、ミドルウェアの中でparasのような新しいkeyを生成することができ、parasはmapであり、このように直接(:a paras)でaの値を取得することができます.もちろんringは定義の基礎の約束で、その上でいろいろなフレームワークです.
しかし、この短いブログを書く主な目的は、自分の知っているjavaと混同しないように注意することです.
clojureとjavaの習慣の違いは大きく、javaの世界では、Request(Response)オブジェクトを取得すると、それを他のクラスに渡して加工し、いくつかのステップを経ても、あなたのRequestは元のRequestで、あなたのResponseは元のResponseで、内容の変化にすぎません.
clojureは可変メインなので、requestとresponseは1つのステップごとに新しいです.
(defn shiro-body
  [handler request]
  (let [subject (build-subject request)
        session-before (.getSession subject false)
        response (.execute (build-callable))
        session-after (.getSession (sec-util/get-subject))]
    (if (and (not session-before) session-after)
      (assoc-in response [:cookies :JSESSIONID] (create-cookie (.getId session-after)))
      (if (and (session-before) (not session-after))
        (assoc-in response [:cookies :JSESSIONID] (create-cookie (.getId session-after) :http-only false :max-age 0))
        response))))

上のコードはringとapache shiroを統合したmiddlewareで、最初はresponseを修正してresponseに戻ればいいと思っていました.しかしclojureのルールはそうではありません.
(let [response {:status 200 :body "hello"}]
    (assoc-in response [:cookies :JSESSIONID] "xxxooo")
    response))
;      ,    response     ,   (assoc-in response [:cookies :JSESSIONID] "xxxooo")     response。      response!

;    。
(let [response {:status 200 :body "hello"}]
    (assoc-in response [:cookies :JSESSIONID] "xxxooo"))

上のshiro-bodyの流れは次のとおりです.
1、入ってきたときにsubjectにセッションがない場合、出てきたときにあったので、セッション操作をしたか、ログインしたか、クッキーにセッションを追加する必要があります.
2、入ってきたときにsubjectにセッションがあったり、出て行ったときになくなったりした場合は、セッションが失効したか、ログインしたか、クッキーを削除する必要があります
3、入っても出てもいないか、あるならやらない.