试图理解Post / Redirect / Get设计模式(用PHP实现)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了试图理解Post / Redirect / Get设计模式(用PHP实现),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3344字,纯文字阅读大概需要5分钟。
内容图文
![试图理解Post / Redirect / Get设计模式(用PHP实现)](/upload/InfoBanner/zyjiaocheng/769/7c303e8fbd304588a84c8df9acc4d87c.jpg)
所有,
提前抱歉 – 我不是PHP专家或知识渊博的设计模式,所以这个问题可能有点基础……
无论如何,我正在开发一个需要登录的网络应用程序.
我的计划是这样的:
index.php:此页面将包含一个允许用户输入用户名和密码的简单表单.表单将POST输入到…
login.php:此页面将从index.php接收输入,并针对数据库检查这些凭据.如果缺少任何输入,或凭据检查失败,php脚本将使用以下命令将用户重定向回index.php:
header('Location: http://www.mydomain.com/index.php');
如果凭据有效,则login.php会创建会话以建立用户的身份验证状态:
session_start();
$_SESSION['authenticated'] = true;
然后,它确定用户具有哪种访问类型.如果他具有“1级”访问权限,则脚本将使用以下内容将用户重定向到level1.php:
header('Location: http://www.mydomain.com/level1.php');
如果用户具有“级别2”访问权限,则脚本将使用以下内容将用户重定向到level2.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和level2.php中进行此检查将阻止用户直接访问该页面,而无需登录.
我的第一个问题是:这个简单的逻辑第一次失败 – 当达到level1.php时,“isset($_ SESSION [‘authenticated’]”总是返回false,因此用户总是被重定向回index.php.他第二次输入完全相同的凭证,该过程按预期工作.
简而言之,由于我不理解的原因,似乎由level1.php找不到login.php设置的会话 – 我假设因为重定向.换句话说,对level1.php的检查似乎失败,直到/除非对客户端的浏览器进行往返.
由于每个需要登录的站点都已经解决了这个问题,这不应该是一个新颖的挑战,它们应该是一个非常成熟的模式.我应该怎么处理?
一个相关的问题……我之前看到过类似的问题,大多数答案通常都涉及一个解决方案,其中页面回归自己.这似乎有点奇怪 – 理想情况下,我希望让每个PHP页面执行特定的工作:
> index.php – 显示要捕获的表单
凭证,然后发布到
的login.php
> login.php – 评估用户的
凭证,然后指导他们
适当的页面
> level1.php& level2.php – 显示
适当的内容
这是一个有缺陷的设置吗?如果是这样,那么更好的设置是什么?
通常 – 如果一个页面建立会话,然后将用户重定向到另一个页面 – 第二页是否有任何方式可以读取会话?
Wikipedia上关于Post / Redirect / Get的页面很棒:
http://en.wikipedia.org/wiki/Post/Redirect/Get
但这对我来说有点概念 – 我希望通过对特定页面的引用来解释它:
例如. “页面A”上的表单将数据发布到“页面B”,“页面B”将用户重定向到“页面C”等…
而且,如果在使用重定向时无法识别会话,我不明白它是如何通过会话实现的.
非常感谢任何建议和见解.
[UPDATE]
感谢Matt Ball的评论,我已经完善了这个问题:
login.php正在设置会话并将用户重定向到下一个屏幕:
session_start();
$_SESSION['authenticated'] = true;
header('Location: http://www.mydomain.com/level1.php');
但是,当level1.php检查该会话时,“已验证”未设置:
session_start();
echo (isset($_SESSION['authenticated']); // returns false
但是,如果我更改了login.php,以便将标头重定向到RELATIVE网址而不是绝对网址:
session_start();
$_SESSION['authenticated'] = true;
header('Location: level1.php');
然后,level1.php像我期望的那样工作:
session_start();
echo (isset($_SESSION['authenticated']); // now returns true
我不明白为什么相对URL有所作为,但确实如此.所以,至少我的直接问题已得到解决.
非常感谢所有评论的人!
干杯,
马特斯图勒
解决方法:
发布重定向如果用户刷新他们在提交表单后被重定向到的页面,则会停止播放以阻止用户重新发送他们的POST数据.当您想要实现PRG时,您应该将HTTP标头代码设置为303,如下所示:
header('Location: level1.php', 303);
内容总结
以上是互联网集市为您收集整理的试图理解Post / Redirect / Get设计模式(用PHP实现)全部内容,希望文章能够帮你解决试图理解Post / Redirect / Get设计模式(用PHP实现)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。