我正在尝试编写登录页面,其中:
用户将使用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来解决这个问题是否有点过分。
感谢您阅读直到最后。