我正在尝试编写登录页面,其中:
用户将使用 post 方法填写表格
如果表单的目标 url 以“/auth-”开头,用户将被重定向到“/login”页面
用户将填写用户名和密码等
如果授权,所有信息将被插入到数据库中
如果用户名或密码为假,所有信息将被保留第二次机会
如果我的目标还不清楚,那么意图与此处描述的没有太大区别。
受此问题启发的这种环绕方法允许我重定向以“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 页面无法显示任何内容。我想问题是不能用帖子数据重定向,正如上面的链接所建议的那样。
我之前的尝试是创建一个函数,它将 url(带有 get 参数)保存在隐藏的输入中,让用户登录,然后重定向到保存的 url。这看起来与此答案的第二个建议非常相似,并且对我有用。只是我不能烘干它。
我想知道这是否可以更简单地使用环绕方法并简单地在任何链接前面添加“auth-”来完成。
还有两点:
我想我可能会将整个表单转储到会话中,而不是像这个答案建议的那样发布它们,但我不想跟踪 cookie。如果用户决定放弃并且所有值都保留在会话中怎么办?
我宁愿永远不要像这里那样依赖 http 状态代码 307 。
最后,我不想尝试restas或caveman之类的框架,因为我想学习lisp并适应。我相信这个问题已经被很多人解决了很多次。过去我用rails构建了一些东西。我就像一个脚本小子,直到我学会了足够多的红宝石来看待事物的本来面目。
编辑
而不是(hunchentoot:redirect "/login")
,我还尝试了(drakma:http-request "http://127.0.0.1:4242/login" :method :post :parameters (hunchentoot:post-parameters* request))
,但以“ERROR MESSAGE 200”失败。顺便说一句,我不知道尝试使用 drakma 来解决这个问题是否是矫枉过正。
感谢您阅读到最后。