Cookies 如何使用compojure设置和获取cookie?

Cookies 如何使用compojure设置和获取cookie?,cookies,clojure,compojure,Cookies,Clojure,Compojure,使用lein new compojure项目名称创建项目,并让服务器引用(包装默认项目名称站点默认值) 在我的处理程序中,我调用控制器并将参数传递给这些控制器。项目结构: handler.clj ;; ring accesses def app controllers/app.clj ;; where route params are sent example: (GET "/signup" {params :params} (controller-app/signup params)) 因此

使用
lein new compojure项目名称创建项目
,并让服务器引用
(包装默认项目名称站点默认值)

在我的处理程序中,我调用控制器并将参数传递给这些控制器。项目结构:

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,什么也得不到

任何帮助都将不胜感激。关于这个问题没有太多的文档,所以不幸的是,这个问题花费了相当长的时间

使用环包装cookie这将在您的请求映射中添加cookie键,更多详细信息在这里,然后使用compjure您可以访问req映射,并且可以使用它


终于用蛮力解决了。当人们说Clojure的文档非常稀少时,这不是开玩笑。关于戒指的几个注意事项:

  • 当你听到会话时,会话不是你所想的。这只是一个签名的cookie,而且文档记录得很差。别理它。我发现的少数几个教程经常出错,当它们的意思是“签名cookie”时使用了“sessions”。文档甚至可以互换使用cookie和会话。为什么?我不知道,因为它们是完全独立的数据存储方法。会话是服务器端内存存储,Cookie是客户端浏览器存储

  • :需要标题,否则cookie将下载到空文本文件中。花了很长时间才发现为什么会这样

  • :路径必须进入cookie正文,否则cookie将仅在设置cookie的页面中保留。你可能会想:路径会在饼干之后,在身体之上。我不明白:路径为什么会与值一起包含在hashmap中。同样,也没有文档说明这是如何或为什么花了很长时间
现在了解如何执行此操作:

在这里,您将cookie从处理程序内部传递给控制器。如果您使用“lein new compojure应用程序名称”创建应用程序,则默认情况下cookie可用。我必须阅读源代码才能弄明白这一点

默认名称空间(app name/handler.clj)-

你的应用程序路由(app name/handler.clj)-

下面是如何设置cookie本身(app name/controllers/home.clj)

handler.clj的底部,使用指定路由的默认包装(app name/handler.clj)

这是一个非常简单的问题,结果却复杂得多。我花了3天的时间才把上面所有的问题都弄清楚。我是Clojure/Ring/Compojure的新手,但这是我编程以来最糟糕的经历

这真的是一个抽象到足以变得危险的问题(所以基本上没有什么是显而易见的)。如果想要更广泛地采用,像Ring这样的库确实需要更好地记录和解释


无论如何,我希望这能帮助到别人。

我个人花了相当多的时间来阅读饼干,因为我对饼干的理解很差

在使用wrap cookies处理程序包装应用程序之后,需要对cookies变量“clojure-way”而不是“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)]))))
有效示例:

  (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)]))))

希望这能有所帮助,

除非我错过了,否则只有一个使用cookies的例子。我可以借用{cookies:cookies}部分。但是,更新:cookie
{:cookies{“name”name}
的选项似乎不起作用。
(包装默认值应用程序路由站点默认值)
是创建新应用时compojure的默认设置,也是我正在使用的。网站默认设置已将wrap cookie设置为true并将其捆绑:这仍然不起作用。会话也不会持续。我有点困惑,像cookie这样简单的东西怎么会是一个问题。
  (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)]))))