Ring.util.response/redirect 不重定向网站
Ring.util.response/redirect does not redirect site
我有一个显示导航栏和版权信息以及处理登录的母版页。它获取用户配置文件,并将其传递给内容功能,如果用户未登录,则为 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"))))
它将 redirecting
打印到控制台,但实际上并没有重定向。我曾多次尝试使用字符串作为重定向代码 "307"
,并排除它以使用默认值 302。我没有尝试过任何导致页面重定向的方法。我做错了什么?
您需要将 response/redirect
作为最后一个表达式,否则您的处理程序 returns nil
是 println
表达式的结果。
但是,我认为您应该系统地处理此类横切关注点,而不是向每个页面添加与安全相关的逻辑。惯用的方法是使用环的中间件。
您可以编写自己的中间件处理程序,它会知道所请求的 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 网络应用程序安全性的库:friend。
如果您正在使用 compojure-api 这就是您在端点上实现重定向的方式:
- 要求处理程序 [ring.util.response :refer [redirect]]
- 端点代码
(GET "/confrimemail" []
(重定向“http://www.zeetomic.com”))
我有一个显示导航栏和版权信息以及处理登录的母版页。它获取用户配置文件,并将其传递给内容功能,如果用户未登录,则为 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"))))
它将 redirecting
打印到控制台,但实际上并没有重定向。我曾多次尝试使用字符串作为重定向代码 "307"
,并排除它以使用默认值 302。我没有尝试过任何导致页面重定向的方法。我做错了什么?
您需要将 response/redirect
作为最后一个表达式,否则您的处理程序 returns nil
是 println
表达式的结果。
但是,我认为您应该系统地处理此类横切关注点,而不是向每个页面添加与安全相关的逻辑。惯用的方法是使用环的中间件。
您可以编写自己的中间件处理程序,它会知道所请求的 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 网络应用程序安全性的库:friend。
如果您正在使用 compojure-api 这就是您在端点上实现重定向的方式:
- 要求处理程序 [ring.util.response :refer [redirect]]
- 端点代码 (GET "/confrimemail" [] (重定向“http://www.zeetomic.com”))