我正在使用會話構建登錄/注銷系統,并遇到了注銷/超時功能的用戶端總結問題。這是由于我構建這些函數操作的頁面的方式。該頁面由實際頁面的中央 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"); }});
僅取消設置但不破壞 php 會話是否安全?
守候你守候我
2022-07-21 21:16:38