3

我正在使用带有 ring/compojure 的 liberator,并希望使用 liberatordefresource宏来处理授权。我可以轻松地handle-ok输出浏览器识别的 html,但handle-unauthorized会在pre标签中输出 html。

我怀疑我无法找到如何做到这一点意味着有充分的理由不这样做。我在网上看到的所有示例都显示handle-unauthorized返回文本,但我希望显示自定义页面。

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

(defresource 拒绝所有
  : 授权?(fn [_] 假)
  :available-media-types ["text/html"]
  :handle-ok (fn [ctx] (html5 [:body [:h1 "Yes!"]])))
  :handle-unauthorized (fn [ctx] (html5 [:body [:h1 "Noooo!"]])))

我从浏览器得到的是文字

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

如果我更改authorized?为返回 true,那么它会正确输出 html。

我尝试过返回环形响应,但这些也会引发错误。我错过了什么?

4

1 回答 1

3

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

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

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

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

  1. 内容协商不适用于 Liberator 中的未授权资源。401 的正文始终是 text/plain 类型。
  2. 当您指定一个 html 字符串作为响应时,它将按原样呈现。
  3. pre使用 Chrome 开发工具时,在检查源代码时,您会看到包含在标签中的 html 字符串。

我希望这有帮助。

于 2013-09-16T23:18:11.993 回答