如何使用 compojure 设置和获取 cookie?
how to set and get cookie with compojure?
使用 lein new compojure project-name
创建项目并让服务器引用 (wrap-defaults project-name site-defaults)
。
在我的处理程序中,我正在调用控制器并将参数传递给那些控制器。项目结构:
handler.clj ;; ring accesses def app
controllers/app.clj ;; where route params are sent
example: (GET "/signup" {params :params} (controller-app/signup params))
所以我遇到的问题是我不知道如何从控制器文件中获取或设置 cookie。我尝试过的事情:
- 将 cookie 作为参数传递:{cookies :cookies}。我可以查看默认 cookie,但无法设置任何数据。
- 使用 cookie 响应和 cookie 请求。无法添加到 cookie 的相同问题。
- 在每条可能的路由中使用 :cookie 并且一无所获。
如有任何帮助,我们将不胜感激。没有太多关于此的文档,所以不幸的是这个问题已经花费了相当多的时间。
使用 wrap-cookie from ring 这将在您的请求映射中添加 cookie 密钥,更多详细信息在此处,然后通过 compjure 您可以访问请求映射,并且可以使用它。
终于可以通过暴力破解了。当人们说 Clojure 的文档非常稀少时,这可不是开玩笑。关于戒指的一些注意事项:
session不是你一听到session就想到的。它只是一个签名的 cookie,而且是一个记录不完整的 cookie。忽略它。我发现的少数教程经常说错,当它们意味着 "signed cookie" 时使用 "sessions"。该文档甚至交替使用 cookie 和会话。为什么?我不知道,因为它们是完全独立的数据存储方法。会话是内存存储中的服务器端,cookie 是客户端浏览器存储。
需要 :headers 否则 cookie 只会下载到一个空文本文件中。花了很长时间才弄清楚为什么会这样。
- :路径必须进入 cookie body 否则 cookie 将只在设置 cookie 的页面上保留。你会认为 :path 会在 :cookies 及以上 :body 之后。对我来说,为什么 :path 将与值一起包含在哈希图中是没有意义的。同样,也没有关于如何或为何如此耗时的文档。
现在介绍如何执行此操作:
在这里,您将 cookie 从处理程序内部传递给控制器。如果您使用 "lein new compojure app-name" 创建您的应用程序,则默认情况下可以使用 Cookie。我必须阅读源代码才能弄明白。
默认命名空间(app-name/handler.clj)-
(ns some-namespace.handler
[compojure.core :refer :all]
[compojure.route :as route]
[ring.middleware.defaults :refer [wrap-defaults site-defaults]
[app-name.controllers.home :as home-controller))
您的应用程序路由 (app-name/handler.clj) -
(defroutes app-routes
(GET "/" {cookies :cookie} (home-controller/home cookies)))
这是您设置 cookie 本身的方式 (app-name/controllers/home.clj)。
(ns app-name.controllers.home)
(defn home [cookies]
{:headers {"Content-Type" "Set-Cookie"},
:cookies {"cookie-name" {:value "cookie-value", :path "/"}},
:body "setting a cookie"})
handler.clj 的底部使用指定路由的默认换行 (app-name/handler.clj)
(def app
(wrap-defaults app-routes site-defaults ))
这是一个非常简单的问题,结果却复杂得多。我花了 3 天时间才弄清楚以上所有内容。我是 Clojure/Ring/Compojure 的新手,但这是我编程以来最糟糕的经历。
这确实是一个抽象程度刚好会变得危险的问题(所以基本上没有什么是显而易见的)。如果想要更广泛的采用,像 Ring 这样的库真的需要更好地记录和过度解释。
无论如何,我希望这对某人有所帮助。
由于对 destructuring in compojure 的理解不足,我个人花了很多时间来阅读 cookie。
使用 wrap-cookies 处理程序包装您的应用程序后,您需要解构 cookies 变量 "the clojure way" 而不是 "the compojure way",因为 cookies 映射不在请求参数映射中。
无效的示例:
(GET "/read-cookie" [cookies]
(let [name (get-in cookies ["name" :value] "")]
(if (empty? name)
(layout/common [:h1 "I don't read a cookie"])
(layout/common [:h1 (str "I read a cookie : " name)]))))
有效示例:
(GET "/read-cookie" {:keys [cookies]} ;; or {cookies :cookies}
(let [name (get-in cookies ["name" :value] "")]
(if (empty? name)
(layout/common [:h1 "I don't read a cookie"])
(layout/common [:h1 (str "I read a cookie : " name)]))))
希望这对您有所帮助,
使用 lein new compojure project-name
创建项目并让服务器引用 (wrap-defaults project-name site-defaults)
。
在我的处理程序中,我正在调用控制器并将参数传递给那些控制器。项目结构:
handler.clj ;; ring accesses def app
controllers/app.clj ;; where route params are sent
example: (GET "/signup" {params :params} (controller-app/signup params))
所以我遇到的问题是我不知道如何从控制器文件中获取或设置 cookie。我尝试过的事情:
- 将 cookie 作为参数传递:{cookies :cookies}。我可以查看默认 cookie,但无法设置任何数据。
- 使用 cookie 响应和 cookie 请求。无法添加到 cookie 的相同问题。
- 在每条可能的路由中使用 :cookie 并且一无所获。
如有任何帮助,我们将不胜感激。没有太多关于此的文档,所以不幸的是这个问题已经花费了相当多的时间。
使用 wrap-cookie from ring 这将在您的请求映射中添加 cookie 密钥,更多详细信息在此处,然后通过 compjure 您可以访问请求映射,并且可以使用它。
终于可以通过暴力破解了。当人们说 Clojure 的文档非常稀少时,这可不是开玩笑。关于戒指的一些注意事项:
session不是你一听到session就想到的。它只是一个签名的 cookie,而且是一个记录不完整的 cookie。忽略它。我发现的少数教程经常说错,当它们意味着 "signed cookie" 时使用 "sessions"。该文档甚至交替使用 cookie 和会话。为什么?我不知道,因为它们是完全独立的数据存储方法。会话是内存存储中的服务器端,cookie 是客户端浏览器存储。
需要 :headers 否则 cookie 只会下载到一个空文本文件中。花了很长时间才弄清楚为什么会这样。
- :路径必须进入 cookie body 否则 cookie 将只在设置 cookie 的页面上保留。你会认为 :path 会在 :cookies 及以上 :body 之后。对我来说,为什么 :path 将与值一起包含在哈希图中是没有意义的。同样,也没有关于如何或为何如此耗时的文档。
现在介绍如何执行此操作:
在这里,您将 cookie 从处理程序内部传递给控制器。如果您使用 "lein new compojure app-name" 创建您的应用程序,则默认情况下可以使用 Cookie。我必须阅读源代码才能弄明白。
默认命名空间(app-name/handler.clj)-
(ns some-namespace.handler
[compojure.core :refer :all]
[compojure.route :as route]
[ring.middleware.defaults :refer [wrap-defaults site-defaults]
[app-name.controllers.home :as home-controller))
您的应用程序路由 (app-name/handler.clj) -
(defroutes app-routes
(GET "/" {cookies :cookie} (home-controller/home cookies)))
这是您设置 cookie 本身的方式 (app-name/controllers/home.clj)。
(ns app-name.controllers.home)
(defn home [cookies]
{:headers {"Content-Type" "Set-Cookie"},
:cookies {"cookie-name" {:value "cookie-value", :path "/"}},
:body "setting a cookie"})
handler.clj 的底部使用指定路由的默认换行 (app-name/handler.clj)
(def app
(wrap-defaults app-routes site-defaults ))
这是一个非常简单的问题,结果却复杂得多。我花了 3 天时间才弄清楚以上所有内容。我是 Clojure/Ring/Compojure 的新手,但这是我编程以来最糟糕的经历。
这确实是一个抽象程度刚好会变得危险的问题(所以基本上没有什么是显而易见的)。如果想要更广泛的采用,像 Ring 这样的库真的需要更好地记录和过度解释。
无论如何,我希望这对某人有所帮助。
由于对 destructuring in compojure 的理解不足,我个人花了很多时间来阅读 cookie。
使用 wrap-cookies 处理程序包装您的应用程序后,您需要解构 cookies 变量 "the clojure way" 而不是 "the compojure way",因为 cookies 映射不在请求参数映射中。
无效的示例:
(GET "/read-cookie" [cookies]
(let [name (get-in cookies ["name" :value] "")]
(if (empty? name)
(layout/common [:h1 "I don't read a cookie"])
(layout/common [:h1 (str "I read a cookie : " name)]))))
有效示例:
(GET "/read-cookie" {:keys [cookies]} ;; or {cookies :cookies}
(let [name (get-in cookies ["name" :value] "")]
(if (empty? name)
(layout/common [:h1 "I don't read a cookie"])
(layout/common [:h1 (str "I read a cookie : " name)]))))
希望这对您有所帮助,