【发布时间】:2014-05-25 16:53:43
【问题描述】:
我显然遗漏了一些明显的东西,但是:
(ns session-demo.core
(:gen-class)
(:use compojure.core
ring.middleware.session
[hiccup core page form])
(:require [compojure.route :as route]
[compojure.handler :as handler]))
(defn index-page []
(html5
[:body
(form-to [:get "/status"]
(submit-button "Proceed"))]))
(defn status-page [params]
(html5
[:body
[:p "Session: " (:session params)]
[:p "Params: " params]]))
(defroutes the-routes
(GET "/" [] (index-page))
(GET "/status" {session :session :as params} (status-page params)))
(def app
(-> (handler/site the-routes)
wrap-session))
点击“继续”按钮后显示:
Session: {}
Params: {:ssl-client-cert nil, :remote-addr "127.0.0.1", :scheme :http, :query-params {}, :session {}, :form-params {}, :multipart-params {}, :request-method :get, :query-string nil, :route-params {}, :content-type nil, :cookies {"org.cups.sid" {:value "72d6fc6a299669e6332da6eb72964f97"}}, :uri "/status", :server-name "localhost", :params {}, :headers {"accept-encoding" "gzip, deflate", "user-agent" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0", "referer" "http://localhost:3000/", "connection" "keep-alive", "accept-language" "en-US,en;q=0.5", "accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "host" "localhost:3000", "cookie" "org.cups.sid=72d6fc6a299669e6332da6eb72964f97"}, :content-length nil, :server-port 3000, :character-encoding nil, :body #, :flash nil}
我希望在 (:session params) 中设置一些有意义的东西...
【问题讨论】:
-
如果我没记错的话,
:session拥有一个映射,其中包含属于该 HTTP 会话的值,默认情况下存储在 cookie 中。因此,除非您在:session映射中添加一些内容(通过返回带有修改后的:session映射的响应),否则您将不会得到任何回报。我看到您有一个名为org.cups.sid的 cookie,如果您将选项映射{:cookie-name "org.cups.sid"}提供给wrap-session函数,它将使用该 cookie 来存储您的会话数据。 -
也尝试过 (wrap-session {:cookie-name "org.cups.sid"}),得到相同的输出...
-
如果担心安全问题,您应该使用内存中的会话,而不是基于 cookie 的会话。这里的问题是,除非你把它放在那里,否则会话中不会有任何东西。
标签: session clojure compojure ring