我有以下logout()函数,适用于大多数浏览器,但不适用于野生动物园。 safari 中的问题是注销后,如果用户点击后退按钮,他们从缓存而不是登录屏幕获取上一页。 有没有办法调整注销功能来处理这个问题?
function logout()
{
// unset any session variables
$_SESSION = [];
// expire cookie
if (!empty($_COOKIE[session_name()]))
{
// setcookie(session_name(), "", time() - 42000);
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]);
}
// destroy session
session_destroy();
}
在我看来
,这是一个浏览器问题,而不是服务器问题。
您是否尝试过配置缓存标头以禁止缓存记录的页面?
作为另一种解决方案,我发现了一个相关的 SO 帖子: 防止在 Safari 5 中后退按钮上缓存 .
您可以尝试此解决方案,该解决方案基本上是将此javascript放在已记录的页面中:
window.onpageshow = function(event) {
if (event.persisted) {
window.location.reload() ;
}
};
要仅在注销后重新加载页面,您可以检查没有cookie,例如,后退按钮在登录时仍然有效。只需将"yourCookieName"
字符串更改为会话 cookie 名称即可。
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1);
if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
}
return null;
}
function hasCookie(cname) {
return getCookie(cname) !== null;
}
window.onpageshow = function(event) {
if (event.persisted && !hasCookie("yourCookieName")) {
window.location.reload(); // or redirect to login page
}
};
请注意: 我认为缓存仍将存在于解决方案 2 的 Safari 中。因此,在我看来,这并不是真正正确处理安全性的解决方案。
在代码中使用重定向函数,例如
function logout()
{
// unset any session variables
$_SESSION = [];
// expire cookie
if (!empty($_COOKIE[session_name()]))
{
// setcookie(session_name(), "", time() - 42000);
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]);
}
// to redirect the user to login page
$return_url = "login.php"; //I'm using login.php you can change it according to your page
// destroy session
session_unset();
session_destroy();
header('Location:'.$return_url); //to redirect to user
}
并且还用于验证用户会话是否存在
session_start();
if($_SESSION[name]=="") {
header("location:index.php");
}
注意:需要在"所有"页面中对用户进行身份验证才能访问 页面(如果只有会话)