Zodiac provides cookie-based sessions and flash messages out of the box.
Session data is available in the request map under :session:
(defn handler [{:keys [session]}]
(let [user-id (:user-id session)]
{:status 200
:body (str "Hello, user " user-id)}))
Include :session in your response to update the session:
(defn login-handler [request]
{:status 200
:body "Logged in"
:session {:user-id 123}})
To update specific keys while preserving others:
(defn update-handler [{:keys [session]}]
{:status 200
:body "Updated"
:session (assoc session :last-seen (System/currentTimeMillis))})
To remove a key:
(defn logout-handler [{:keys [session]}]
{:status 200
:body "Logged out"
:session (dissoc session :user-id)})
The current session is also bound to zodiac.core/*session*:
(require '[zodiac.core :as z])
(defn some-helper []
;; Access session without passing it explicitly
(:user-id z/*session*))
Configure session cookies via start options:
(z/start {:routes routes
:cookie-secret "16-char-secret!" ;; Required: exactly 16 characters
:cookie-attrs {:http-only true ;; Default: true
:same-site :lax ;; Default: :lax
:secure true ;; For HTTPS
:max-age 86400}}) ;; Seconds
Flash messages are session data that persists for exactly one request—useful for showing notifications after redirects.
Include :flash in your response:
(defn create-handler [request]
{:status 302
:headers {"Location" "/items"}
:flash {:success "Item created!"}})
Flash data appears in the next request under :flash:
(defn list-handler [{:keys [flash]}]
[:div
(when-let [msg (:success flash)]
[:div.alert msg])
[:ul
;; list items...
]])
After being read, flash data is automatically cleared.
Flash is commonly used with the PRG pattern:
(def routes
["/items"
["" {:get list-handler}]
["/new" {:get new-form
:post create-handler}]])
(defn create-handler [{:keys [params]}]
;; ... create item ...
{:status 302
:headers {"Location" "/items"}
:flash {:success "Item created successfully!"}})
(defn list-handler [{:keys [flash]}]
[:div
(when (:success flash)
[:div.notification (:success flash)])
;; ... render list ...
])
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |