hunchentoot围绕使用帖子参数重定向的方法

时间:2017-04-01 11:30:55

标签: common-lisp hunchentoot

我正在尝试编写登录页面,其中:

  • 用户将使用post方法

  • 填写表单
  • 如果表单的目标网址以" / auth - "开头,则用户将被重定向到" / login"页

  • 用户将填写用户名和密码等

  • 如果授权,所有信息将被插入数据库

  • 如果用户名或密码为false,所有信息将被保留第二次机会

如果我的目标尚不明确,那么意图与as described here没有太大的不同。

这个围绕this question启发的方法允许我重定向任何以" auth - "开头的链接重定向到登录页面,以及获取参数:

(defmethod hunchentoot:acceptor-dispatch-request :around
    ((acceptor hunchentoot:easy-acceptor) request)
  (let* ((address-bar (cl-ppcre:split "\\?" (hunchentoot:request-uri* request)))
         (just-url (first address-bar))
         (query-params (second address-bar)))
    (if (cl-ppcre:scan "^/auth-" just-url)
      (hunchentoot:redirect (if query-params
                (format nil "/login?~A" query-params)
                "/login"))
      (call-next-method))))

但是如何改为使用post参数重定向呢?

我想是这样的:

(defmethod hunchentoot:acceptor-dispatch-request :around
    ((acceptor hunchentoot:easy-acceptor) request)
  (let* ((just-url (car (cl-ppcre:split "\\?" (hunchentoot:request-uri* request)))))
    (if (cl-ppcre:scan "^/auth-" just-url)
      (hunchentoot:redirect "/login")
      (call-next-method))))

(hunchentoot:define-easy-handler (login :uri "/login") ()
  (with-html-output (*standard-output* nil :prologue t)
    (:html
     (:body
      (dolist (post (hunchentoot:post-parameters*))
    (format t "<div>~A ~A</div>" (car post) (cadr post)))))))

会起作用,但是/ login页面无法显示任何内容。我想问题是,无法按照the link above的建议,使用帖子数据重定向。

我之前的尝试是创建一个函数,该函数将url(带有get参数)保存在隐藏的输入中,让用户登录,然后重定向到保存的URL。这看起来与2nd suggestion of this answer非常相似,对我有用。只是我不能干它。

我想知道是否可以更简单地使用around方法并简单地添加&#34; auth - &#34;在任何链接前面。

还有两点:

  • 我想我可以将整个表单转储到会话中,而不是像this answer suggests那样发布它们,但我不想跟踪cookie。如果用户决定放弃并且所有值都保留在会话中该怎么办?

  • 我宁愿永远不要依赖http状态代码307 like here

  • 最后,我不想尝试像restas或caveman这样的框架,因为我想学习lisp并适应。我确信这个问题已被很多人解决了很多次。在过去,我用rails构建了一些东西。我就像一个脚本小孩,直到我学会了足够的红宝石来看待它们的方式。

修改

而不是(hunchentoot:redirect "/login"),我还尝试了(drakma:http-request "http://127.0.0.1:4242/login" :method :post :parameters (hunchentoot:post-parameters* request)),其失败了&#34; ERROR MESSAGE 200&#34;。顺便说一句,我不知道是否尝试使用drakma来解决这个问题是否有点过分。

感谢您阅读直到最后。

0 个答案:

没有答案