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コードを示します.
ミドルウェア(javaのfilterに相当)
ミドルウェアの役割ここでは上記の例を挙げますが、最終的に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つのステップごとに新しいです.
上のコードはringとapache shiroを統合したmiddlewareで、最初はresponseを修正してresponseに戻ればいいと思っていました.しかしclojureのルールはそうではありません.
上のshiro-bodyの流れは次のとおりです.
1、入ってきたときにsubjectにセッションがない場合、出てきたときにあったので、セッション操作をしたか、ログインしたか、クッキーにセッションを追加する必要があります.
2、入ってきたときにsubjectにセッションがあったり、出て行ったときになくなったりした場合は、セッションが失効したか、ログインしたか、クッキーを削除する必要があります
3、入っても出てもいないか、あるならやらない.
まず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、入っても出てもいないか、あるならやらない.