代码之家  ›  专栏  ›  技术社区  ›  mattstuehler

尝试理解Post/Redirect/Get设计模式(用PHP实现)

  •  4
  • mattstuehler  · 技术社区  · 15 年前

    所有人,

    预先抱歉-我不是PHP专家,也不是设计模式方面的专家,所以这个问题可能有点基本。。。

    无论如何,我正在开发一个需要登录的web应用程序。

    我的计划是这样的:

    index.php索引:此页将包含一个简单的表单,允许用户输入用户名和密码。表格会将输入张贴到。。。

    登录.php:此页将接收来自index.php索引,并根据数据库检查这些凭据。如果缺少任何输入,或者凭据检查失败,php脚本将 重定向 用户返回到index.php索引使用:

    header('Location: http://www.mydomain.com/index.php');
    

    如果凭据有效,则登录.php创建会话以建立用户的身份验证状态:

    session_start();
    $_SESSION['authenticated'] = true;
    

    然后,它确定用户具有什么访问类型。如果他有“level1”访问权限,脚本将使用以下命令将用户重定向到level1.php:

    header('Location: http://www.mydomain.com/level1.php');
    

    header('Location: http://www.mydomain.com/level2.php');
    

    最后,当达到level1.php或level2.php时,他们首先要做的是检查会话。如果用户未通过身份验证,请将其重定向回index.php索引:

    session_start();
    if (!isset($_SESSION['authenticated']) {
        header('Location: http://www.mydomain.com/index.php');
    } else {
        // proceed to display the page
    }
    

    我的第一个问题是:这个简单的逻辑在第一次到达level1.php时失败,“isset($_SESSION['authenticated']” 总是

    简言之,由于我不明白的原因,这次会议似乎是由登录.phplevel1.php找不到-我假设是因为重定向。换句话说,直到/除非往返于客户端浏览器,否则对level1.php的检查似乎失败。

    因为每一个需要登录的站点都已经解决了这个问题,所以这不应该是一个新的挑战,它们应该是一个非常成熟的模式。我该怎么处理?

    • index.php索引-显示要捕获的窗体 凭据,然后将它们发布到 登录.php
    • 登录.php-评估用户的 凭证,然后将它们指向
    • level1.php&level2.php-显示 适当的内容

    一般来说,如果一个页面建立了会话,然后将用户重定向到另一个页面,那么第二个页面是否可以读取会话?

    维基百科上有一个很棒的关于Post/Redirect/Get的页面:

    http://en.wikipedia.org/wiki/Post/Redirect/Get

    但这对我来说有点概念性——我想看看它是如何通过引用特定页面来解释的:

    E、 g.“a页”上的表单将数据发布到“B页”,“B页”将用户重定向到“C页”等。。。

    而且,如果在使用重定向时无法识别会话,我也不明白它是如何通过会话实现的。

    非常感谢您的建议和见解。


    多亏了马特·鲍尔的评论,我对这个问题进行了改进:

    登录.php正在设置会话并将用户重定向到下一个屏幕:

    session_start();
    $_SESSION['authenticated'] = true;
    header('Location: http://www.mydomain.com/level1.php');
    

    但是,当level1.php检查该会话时,“authenticated”是 :

    session_start();
    echo (isset($_SESSION['authenticated']); // returns false
    

    但是,如果我改变了登录.php使标题重定向到 url而不是绝对url:

    session_start();
    $_SESSION['authenticated'] = true;
    header('Location: level1.php');
    

    那么,level1.php的工作方式与我预期的一样:

    session_start();
    echo (isset($_SESSION['authenticated']); // now returns true
    

    非常感谢所有发表评论的人!


    马特·斯图勒

    2 回复  |  直到 15 年前
        1
  •  1
  •   Nev Stokes    15 年前

    Post Redirect Get进入播放,如果用户在提交表单后刷新了被重定向到的页面,则停止重新发送其Post数据。当您想要实现一个PRG时,您应该将HTTP头代码设置为303,如下所示:

    header('Location: level1.php', 303);
    
        2
  •  0
  •   mhitza Federico Taschin    15 年前

    如果凭据有效,则登录.php创建会话以建立用户的身份验证状态:

    我也在黑暗中拍摄,但我的印象是你可以在设置会话之前输出一些东西登录.php. 地点 session_start 作为每个文件的第一条指令。

    推荐文章