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

时间:2016-03-26 18:13:54

标签: redirect clojure http-redirect compojure ring

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

(ns kandj.views.content
  (:require [ring.util.response :as response]))

对于内容功能,我有以下代码:

(defn profile [g-profile]
  (if (nil? g-profile)
    (do (response/redirect "/" 307)
        (println "redirecting"))
    ))

它将redirecting打印到控制台,但实际上并没有重定向。我已尝试使用字符串作为重定向代码"307",并将其排除使用默认值302.我尝试过的任何内容都会导致页面重定向。我做错了什么?

2 个答案:

答案 0 :(得分:4)

您需要将response/redirect作为最后一个表达式,否则您的处理程序将返回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)))

您还可以查看用于处理响铃的网络应用安全性的库:friend

答案 1 :(得分:0)

如果您使用的是compojure-api,则这是在端点上实现重定向的方式:

  1. 在处理程序[ring.util.response:refer [redirect]]
  2. 上对此进行配置
  3. 端点代码 (获取“ / confrimemail” []    (重定向“ http://www.zeetomic.com”))