【问题标题】:clearing a session (logging a user out) in clojure-ring在 clojure-ring 中清除会话(注销用户)
【发布时间】:2015-02-18 14:33:38
【问题描述】:

我的印象是简单地将请求映射的 :session 设置为 nil 会导致注销,我的代码如下所示:

(GET "/logout" [ :as request] 
  (if-let [useremail (get-in request [:session :ph-auth-email])]
    (-> (response {:status 200,
                   :body (pr-str "logged out " useremail),
                   :headers {"Content-Type:" "text/html"}})
        (assoc request [:session nil]))))

但我得到一个错误:

java.lang.Thread.run(Thread.java:745)

2015-02-18 09:29:05.134:WARN:oejs.AbstractHttpConnection:/logout

java.lang.Exception: Unrecognized body: {:status 200, :body "\"logged out \" \"sova\"", :headers {"Content-Type:" "text/html"}}

【问题讨论】:

  • 这真的取决于你如何维护你的会话。可以分享一下登录密码吗?
  • 显然错误消息与会话无关,而是与一般响应和具体的正文有关。

标签: session clojure ring


【解决方案1】:

ring.util.response/response 只需要 body 作为参数,因为它将围绕它构建 :status 和 :headers(参见 here)。但是,映射不是有效的主体 - 只允许使用字符串、文件、流。

所以,这就是导致异常的原因;现在,关于您的问题:您可以通过在 response (source) 中将 :session 设置为 nil 来注销用户 - 这会将您的代码简化为:

(GET "/logout" [:as request] 
  (if-let [useremail (get-in request [:session :ph-auth-email])]
    {:status 200,
     :body (pr-str "logged out " useremail),
     :session nil, ;; !!!
     :headers {"Content-Type" "text/html"}}))

【讨论】:

  • 啊哈,响应完成了所有细节。说得通。谢谢,非常感谢
  • 我刚刚注意到的一件事是“Content-Type”里面不应该有冒号,否则它不会正确设置内容类型,它会提示你下载文件而不是显示结果到浏览器。除了那个小细节,完美。
  • 我调整了代码示例以包含正确的标题名称。
猜你喜欢
  • 2012-06-04
  • 1970-01-01
  • 2015-03-03
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2016-12-09
  • 2013-03-28
相关资源
最近更新 更多