代码之家  ›  专栏  ›  技术社区  ›  Matt Sheppard

当请求被登录页中断时保留HTTP POST数据

  •  4
  • Matt Sheppard  · 技术社区  · 17 年前

    假设一个用户正在浏览一个网站,然后执行一些更改数据库的操作(假设他们添加了一个注释)。但是,当实际添加注释的请求出现时,我们发现需要强制它们登录,然后才能继续。

    假设登录页面要求输入用户名和密码,并将用户重定向回需要登录时要访问的URL。这个重定向对只有get参数的URL有效,但是如果请求最初包含一些HTTP POST数据,那么现在就丢失了。

    当涉及到HTTP POST数据时,有人能推荐一种处理这种情况的方法吗?

    显然,如果需要的话,登录页面可以动态生成一个包含所有post参数的表单来传递这些参数(尽管这看起来很混乱),但是即使这样,我也不知道登录页面如何在将post数据保存在请求中的同时将用户重定向到其预期页面。


    编辑 :我应该已经明确了一个额外的约束——假设在用户提交评论之前,我们不知道是否需要登录。例如,他们的cookie可能在加载表单和实际提交注释之间过期。

    6 回复  |  直到 17 年前
        1
  •  2
  •   Mark Brackett    17 年前

    2种选择:

    1. 从登录页面写出杂乱的表单,并将javascript form.submit()提交到页面。
    2. 让登录页面本身发布到请求页面(使用前面的值),并让该页面的控制器执行登录验证。将它转入您已经拥有的用于检测未登录用户的逻辑中(框架根据它们的工作方式而有所不同)。在伪MVC中:
    
            CommentController {
               void AddComment() {
                 if (!Request.User.IsAuthenticated && !AuthenticateUser()) {
                    return;
                 }
                 // add comment to database
               }
    
               bool AuthenticateUser() {
                 if (Request.Form["username"] == "") {
                    // show login page
                    foreach (Key key in Request.Form) {
                       // copy form values
                       ViewData.Form.Add("hidden", key, Request.Form[key]);
                    }
                    ViewData.Form.Action = Request.Url;
    
                    ShowLoginView();
                    return false;
                  } else {
                     // validate login
                     return TryLogin(Request.Form["username"], Request.Form["password"]);
                  } 
               }
            }
    
        2
  •  11
  •   Gulzar Nazim    17 年前

    在这里,Ajax技术可能会有所帮助。当用户单击提交按钮时,在客户端显示登录对话框,并在实际提交页面之前与服务器进行验证。

    我可以想到的另一种方法是在主页面本身动态地显示或隐藏DIV标记中的登录控件。

        3
  •  3
  •   Jacob Rigby    17 年前

    你可能想调查一下为什么是姜戈 removed this feature 在自己实施之前。这看起来不像是一个特定于Django的问题,而是另一个跨站点的伪造攻击。

        4
  •  2
  •   Robert Swisher    17 年前

    只需将日志中的所有必要数据存储在会话中,直到登录过程完成。或者在数据库中存储某种临时表,然后检索它。显然这是伪代码,但:

    if ( !loggedIn ) {
        StorePostInSession();
        ShowLoginForm();
    }
    
    if ( postIsStored ) {
        RetrievePostFromSession();
    }
    

    或者沿着这些线。

        5
  •  1
  •   kukudas    17 年前

    收集他们提交的页面上的数据,并将其存储在后端(数据库?)当他们浏览登录序列时,在登录表单页面上隐藏一个事务ID或类似的ID。完成后,通过在后端使用事务ID进行查找,将它们返回到所请求的页面,并将它们发布到表单中的所有数据转储,以便再次预览,或者只运行该页面将运行的任何代码。

    请注意,如果用户需要登录以发表评论,但尚未登录,那么许多系统(如博客)都可以通过使用与发布评论相同的登录字段来绕过这一问题。

        6
  •  1
  •   user4903    17 年前

    我知道它说语言不可知论,但是为什么不利用您使用的服务器端语言提供的约定呢?如果是Java,则可以通过设置请求属性来持久地保存数据。您将使用一个控制器来处理表单,检测登录,然后通过转发。如果设置了属性,那么只需用该数据预填充表单?

    编辑: 您也可以使用一个会话作为指出,但我很肯定,如果你使用一个在Java中的前进回到登录页面,请求属性将坚持。

    推荐文章