我已经在我的应用程序中实现了会话,但是我需要允许登录的用户使用后退按钮转到以前的页面。如何确保会话不会过期并允许用户查看上一页?
我的代码
<?php
//Start session
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
$User = $_SESSION["User"];
//Page content
?>
我已经开始了会话,当我使用浏览器上的后退按钮时,我得到一个读取会话已经过期的页面。这是我不希望发生的。
在php的每个页面的顶部,在打开<html>
标签之前开始会话
<?php session_start(); ?>
<html>
在php的某个地方设置会话变量注意这个值必须是serializable
<?php $_SESSION["variable"] = "value"; ?>
如果你想访问这个会话变量,你可以在之后调用session_start();
<?php echo $_SESSION["variable"]; ?>
如果您以这种方式处理会话,会话变量将在以前和以后的页面上可用。
注意:
根据浏览器和服务器发送的报头,当你返回一个页面时,它会重新加载页面,因为它在缓存中,所以考虑以下内容:
- 用户进入页面,但没有设置会话变量
- 用户设置会话变量并将其发送到第二页的操作
- 用户点击返回按钮
- 用户显示会话前缓存版本的第一页
- 用户刷新页面
- 用户现在看到第一页w/session变量设置
打嗝的原因是一些浏览器不总是对后退按钮发出新的请求,有时它从浏览器缓存加载。阅读这个答案的最后:https://stackoverflow.com/a/1313941/884453
编辑
上面的代码首先检查了session_status。这是不正确的。你总是需要这样的session_start();
<?php
//Start session
session_start();
// User is either pulled from the session or is null
$User = $_SESSION["User"] ? !empty($_SESSION["User"]) : NULL;
//Page content
?>
if (session_status() !== PHP_SESSION_ACTIVE) {
的代码仅在一些其他代码位(通常在框架中)可能已经启动会话的情况下有用。
如果您已经正确设置了会话管理,则不需要做任何事情。
然而,这个是否正确取决于您在会话中拥有什么样的状态以及您如何管理它。此外,超时仍然适用(因为他们应该)。你可以使用javascript的历史方法,这样你的会话也保持不变。
<button onclick="goBack()">Go Back</button>
<script>
function goBack() {
window.history.back();
}
</script>