每次我在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)))
我错过了一些明显的东西吗?
答案 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-defaults
和ring.middleware.session