Ring.util.response/redirect不重定向站点

Ring.util.response/redirect不重定向站点,redirect,clojure,http-redirect,compojure,ring,Redirect,Clojure,Http Redirect,Compojure,Ring,我有一个母版页,显示导航栏和版权信息,以及处理登录。它获取用户配置文件,并将其传递给内容函数,如果用户未登录,则传递为nil。因此,对于需要登录的页面,我将在顶部进行检查,如果用户未登录,则重定向。名称空间声明包括 (ns kandj.views.content (:require [ring.util.response :as response])) 对于内容函数,我有以下代码: (defn profile [g-profile] (if (nil? g-profile) (

我有一个母版页,显示导航栏和版权信息,以及处理登录。它获取用户配置文件,并将其传递给内容函数,如果用户未登录,则传递为nil。因此,对于需要登录的页面,我将在顶部进行检查,如果用户未登录,则重定向。名称空间声明包括

(ns kandj.views.content
  (:require [ring.util.response :as response]))
对于内容函数,我有以下代码:

(defn profile [g-profile]
  (if (nil? g-profile)
    (do (response/redirect "/" 307)
        (println "redirecting"))))
它将重定向打印到控制台,但实际上并不重定向。我已经尝试过为重定向代码307使用字符串,并排除它以使用默认值302。我尝试的任何操作都不会导致页面重定向。我做错了什么?

您需要将响应/重定向作为最后一个表达式,否则处理程序将返回nil,这是println表达式的结果

但是,我认为您应该系统地处理这些交叉关注点,而不是在每个页面中添加与安全相关的逻辑。惯用的方法是使用ring的中间件

您可以编写自己的中间件处理程序,它将知道请求的URL是否需要对用户进行身份验证,并传递到页面呈现或重定向到登录页面

例如:

(defn authenticated? [request]
  ... your logic to check if the user is authenticated or not...)

(defn secured-url? [request]
  ... your logic for determining if the requested page requires authenticated user...)

(defn wrap-user-auth-check [handler]
  (fn [request]
    (if (and (secured-url? request)
             (authenticated? request))
      (handler request)
      (response/redirect "/"))))

(def app
  (-> handler
    (wrap-user-auth-check)))
您还可以查看一个用于处理ring:的web应用程序安全性的库。

如果您正在使用此库,则可以在端点上实现重定向:

在处理程序[ring.util.response:refer[redirect]]上重新请求此 端点代码 获取/确认电子邮件[] 重新使用
哦有没有办法让它冒出泡沫,成为唯一被归还的东西?我用hiccup做模板。删除println之后,我得到{:status 302,:headers{Location/},:body}作为另一个代码的结果。这通常是如何做到的?我已经解决了这个问题,但如果有一个标准的方法来做,它就不太理想了。据我所知,没有返回函数。这似乎是处理这种情况的最佳方法。我已经用更多信息增强了我的答案,说明如何在您的web应用程序中处理此类情况。关于返回函数:Clojure中没有此类构造。相反,Clojure中的每个表单都是一个表达式,并且有一个返回值。因此,在您的情况下,逻辑应该是如果某些条件响应/重定向/呈现页面谢谢!这样做更有意义