每次保存都会重置振铃会话(Compojure)

时间:2015-03-17 17:09:29

标签: clojure ring compojure

每次我在Ring项目中保存Clojure源文件时,会话都会重置。

请注意ring-session ID。我先保存了handler.clj文件:

2015-03-17 11:02:51,857 INFO  onelog.core: Starting :get / for 127.0.0.1 {"accept-encoding" "gzip, deflate, sdch", "cache-control" "max-age=0", "connection" "keep-alive", "user-agent" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36", "accept-language" "en-US,en;q=0.8", "accept" "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "host" "localhost:3000", "cookie" "ring-session=40575c9e-fbe9-4fd5-8624-d5e4ef9d98a9"}
2015-03-17 11:02:51,859 INFO  onelog.core: Finished :get / for 127.0.0.1 in (2 ms) Status: 404
2015-03-17 11:03:01,147 INFO  onelog.core: Starting :get / for 127.0.0.1 {"accept-encoding" "gzip, deflate, sdch", "cache-control" "max-age=0", "connection" "keep-alive", "user-agent" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36", "accept-language" "en-US,en;q=0.8", "accept" "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "host" "localhost:3000", "cookie" "ring-session=26aadcce-e665-43df-afa5-0f09f98351ac"}
2015-03-17 11:03:01,149 INFO  onelog.core: Finished :get / for 127.0.0.1 in (2 ms) Status: 404

如果您与登录用户合作,只会在每次更改时都必须重新登录,这会让您感到烦恼。

这是我处理程序中的内容:

(def app
  (-> app-routes
      (friend/authenticate auth-config)
      (wrap-defaults site-defaults)  
      (logger/wrap-with-logger)))

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:4)

您可能在创建(def)处理程序时实例化一个新的会话存储。有多种方法可以解决这个问题。直接方法是使用defonce定义单个会话存储,并在创建新处理程序时重用它。如果您需要多个独立处理程序(用于测试等),这将导致问题。查看组件以获得更全面的解决方案。

更新OP后:

(wrap-defaults req site-defaults)这里会在每次评估时创建一个新的(内存中为空)会话存储,因此每当调用(def app ...)时,所有旧会话都将失效。

简单的解决方案是使用类似

的东西
(defonce app
  (-> #'app-routes ;; reevaluate app-routes at every request
      (friend/authenticate auth-config)
      (wrap-defaults site-defaults)  
      (logger/wrap-with-logger)))

这样就可以在不重置会话的情况下加载包含应用程序的文件,但代价是更加繁琐地添加中间件。

更多涉及的替代方案包括使用持久(磁盘,数据库,memcached等)或基于纯cookie(客户端)的会话存储,在重新加载wrap-defaults时不会被清空。请参阅wrap-defaultsring.middleware.session

的文档