我正在使用会话构建登录/注销系统,并遇到了注销/超时功能的用户端总结问题。这是由于我构建这些函数操作的页面的方式。
该页面由实际页面的中央 iFrame 构建,周围有一个顶部导航栏和两个用于导航的侧边栏。侧边栏由几个 PHP 元素组成,每个元素检查是否设置了 $_SESSION["idUser"],并且 jQuery 函数在特定元素时刷新对登录状态(菜单和仅登录内容)敏感的元素被点击。我以这种方式构建它的原因是因为该页面处理浏览器游戏,并且我希望用户停留在单个 URL 上(没有任何游戏内容的永久链接)。
登录/注销按钮由 jQuery 处理,它向 PHP 文件发送 AJAX 请求,该文件处理所有用户验证并刷新侧边栏元素。当用户登录处理程序时,处理程序会重新生成会话 ID(因为页面未刷新,否则如果用户注销并在同一个位置重新登录,则会话 ID 不会改变,从我目前的经验来看)。这样,无论发生什么,当您登录时,旧的会话 id 都会丢失。注销时,PHP 处理程序取消设置 $_SESSION 变量,然后销毁会话。
我想要做的是在注销/超时后显示一个通知,显示用户是否自己注销或会话是否超时。我可以使用处理按钮的 Javascript 来做到这一点——因为页面本身不会刷新,所以函数会继续运行,我可以简单地让它在某处放置一些文本。我真的很想将通知放在登录表单中,就在登录按钮的正上方,因为这是人们在检查有关登录状态的信息时会查看的地方。
问题是登录表单是由按钮上的 jQuery 脚本重新加载的侧边栏元素之一。jQuery 脚本首先将 AJAX 请求发送到 PHP 处理程序,然后命令重新加载侧边栏元素。但是,如果我在 .load() 部分之后附加 .done() ,则 jQuery 不会等待内容重新加载,这意味着我不能使用相同的 jQuery 函数将一些文本放入登录表单,因为 jQuery将尝试在表单加载到页面之前添加文本。
到目前为止,我想出的唯一解决方案是不破坏会话,而是设置 $_SESSION["response"]="logged out",然后让登录表单回显该值。
我的问题是:a)给定页面的构造方法,有没有什么方法可以在不保留PHP会话的情况下达到这个效果?b)如果不是,在注销时不销毁会话是否安全,而仅在登录时重新生成会话 ID?
jQuery代码:
$(".column").on("click", "#login, #logout", function () { //This handles the login/logout buttons
var formData = $(event.target).parent().parent().serialize(); //put the form data in a string
if (formData !== "") { formData += "&"; }
formData += event.target.id + "=" + event.target.id;
$.post("/backend/validateUser.php", formData) //post the login/logout data to the handler file
.done(function() { //refesh navbar and all sidebars
$(".navbar, #sidebartopl, #sidebartopr, #sidebarbottoml, #sidebarbottomr").each(function(){
$(this).load("/layout/"+$(this).attr("phpsource")+".php");
});
})
if ($(this).attr("id") === "login") {
$(".navbar").removeClass("collapsed");
} else if ($(this).attr("id") === "logout") {
$(".navbar").addClass("collapsed");
}
});
精慕HU
相关分类