微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Compojure / Ring:为什么带有cookie存储的会话在服务器重启后仍然存在?

我有一个compojure应用程序,它使用ring会话包装器来存储与当前用户关联的OAuth令牌.我希望这个令牌在服务器重新启动时保持可用,这样我就不必每次都要经过身份验证过程.

我假设使用cookie-store而不是认的内存存储会有所帮助,但事实并非如此.我错过了什么?

这是代码的相关部分:

(defn auth-callback-handler
  [session {code :code}]
  (let [token (retrieve-token code)]
    (-> (redirect "/") (assoc :session (assoc session :token token)))))

(defroutes app-routes
  (GET "/" {session :session} (root-handler session))
  (GET "/auth-callback" {session :session params :params} (auth-callback-handler session params))
  (route/not-found "Not Found"))

(def app
  (-> (handler/site app-routes)
      (wrap-session {:store (cookie-store {:key "a 16-byte secret"})})))

函数root-handler使用令牌来决定是否有人登录,但不会以会话信息的方式返回任何内容.

解决方法

问题是你的应用程序中有2个包装会话中间件,因为处理程序/站点附带了一个.这导致加密/解密运行两次.要配置compojure会话句柄,请使用:
(def app
  (site app-routes {:session {:store (cookie-store {:key "a 16-byte secret"})}}))

此外,您可能会对其中一些实现环SessionStore协议的项目感兴趣:

https://github.com/sritchie/couch-session

https://github.com/wuzhe/clj-redis-session

https://github.com/rmarianski/servlet-session-store

要使最后一个持久化,您需要检查所选servlet容器的文档.

原文地址:https://www.jb51.cc/html/231717.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐