Clojure 为解放者输出html';我们处理未经授权的

Clojure 为解放者输出html';我们处理未经授权的,clojure,compojure,liberator,Clojure,Compojure,Liberator,我将liberator与ring/compojure一起使用,并希望使用liberatordefresource宏来处理授权。我可以轻松获得handle ok以输出浏览器识别的html,但是handle unauthorized将在pre标记中输出html 我怀疑我无法找到如何做到这一点意味着有一个很好的理由不这样做。我在网上看到的所有示例都显示处理未经授权的返回文本,但我希望显示一个自定义页面 这是我使用的代码的(一个版本)。我正在使用Hiccup: (defresource deny-all

我将liberator与ring/compojure一起使用,并希望使用liberator
defresource
宏来处理授权。我可以轻松获得
handle ok
以输出浏览器识别的html,但是
handle unauthorized
将在
pre
标记中输出html

我怀疑我无法找到如何做到这一点意味着有一个很好的理由不这样做。我在网上看到的所有示例都显示
处理未经授权的返回文本,但我希望显示一个自定义页面

这是我使用的代码的(一个版本)。我正在使用Hiccup:

(defresource deny-all :authorized? (fn [_] false) :available-media-types ["text/html"] :handle-ok (fn [ctx] (html5 [:body [:h1 "Yes!"]]))) :handle-unauthorized (fn [ctx] (html5 [:body [:h1 "Noooo!"]]))) (defresource拒绝所有 :已授权?(fn[u]错误) :可用媒体类型[“文本/html”] :句柄正常(fn[ctx](html5[:body[:h1“Yes!”])) :未经授权处理(fn[ctx](html5[:body[:h1“nooo!”])) 我从浏览器中得到的是文字

<!DOCTYPE html>
<html><body><h1>Noooo!</h1></body></html>
</pre>

不!
如果我将
authorized?
更改为返回true,则它将正确输出html


我尝试过返回环式响应,但这些也会引起错误。我遗漏了什么?

在REST对话中,html是资源的许多可能表示形式之一。由于该资源未经授权,因此不应返回任何表示(html或其他)。相反,根据401状态错误的指示,客户端应该采取不同的操作过程,例如请求登录页面

在web框架中编写的大多数应用程序不会返回401,而是重定向到授权页面。这在Liberator中也是可能的,因为没有任何东西可以阻止您在资源本身中处理授权(使用逻辑处理ok)

这可能违反惯例。我在Liberator的github上发布了一篇文章,征求对RESTful烹饪食谱更了解的人的意见

无论如何,您看到html被包装在pre标记中的原因是以下因素的结果:

  • 解放者中未经授权的资源无法使用内容协商。401的主体始终为text/plain类型
  • 当您指定一个html字符串作为响应时,它将按原样呈现
  • 使用Chrome开发工具时,检查源代码后,您将看到html字符串包装在
    pre
    标记中

  • 我希望这有帮助。

    是的,有帮助。我还从你发布的链接中看到,如果我坚持发送html,那么我可以通过
    :handleunauthorized(fn[;](liberator.representation/ring-response{:body“go-away”:headers{“Content-Type”“text/html”}])