Session 在clojure环中清除会话(注销用户)

Session 在clojure环中清除会话(注销用户),session,clojure,ring,Session,Clojure,Ring,给人的印象是,简单地将请求映射的: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),

给人的印象是,简单地将请求映射的: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"}}
只需要将主体作为参数,因为它将围绕主体构建
:status
:headers
(请参阅)。但是,映射不是有效的主体-只允许字符串、文件和流

因此,这就是导致异常的原因;现在,关于您的问题:您可以通过在响应中将
: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"}}))

这实际上取决于您如何维持会话。你能分享登录的代码吗?显然,错误消息与会话无关,但与一般的响应和具体的正文有关。啊哈,响应就是这些。有道理。谢谢,我刚才注意到的一件事是,“内容类型”不应该在里面有冒号,否则它将无法正确设置内容类型,它将提示您下载文件,而不是将结果显示到浏览器。除了那个小细节,太完美了。我调整了代码示例以包含正确的标题名。