溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

js關(guān)閉瀏覽器時(shí)退出賬號(hào)怎么處理

發(fā)布時(shí)間:2021-12-03 16:26:45 來(lái)源:億速云 閱讀:236 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“js關(guān)閉瀏覽器時(shí)退出賬號(hào)怎么處理”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“js關(guān)閉瀏覽器時(shí)退出賬號(hào)怎么處理”吧!

經(jīng)典做法

眾所周知,為了賬戶安全,用戶未主動(dòng)點(diǎn)擊注銷系統(tǒng)時(shí),直接關(guān)閉瀏覽器或標(biāo)簽頁(yè)強(qiáng)制退出系統(tǒng)的方法:

// 關(guān)閉時(shí)調(diào)用注銷接口
window.onbeforeunload = function() {
 //執(zhí)行注銷ajax調(diào)用,簡(jiǎn)單示例
 $.ajax({url:"/logout"});
};

問(wèn)題

此方式有嚴(yán)重問(wèn)題, 會(huì)造成刷新頁(yè)面時(shí)也被調(diào)用注銷, 很多系統(tǒng)必須支持刷新頁(yè)面保持會(huì)話,如何處理?

沒(méi)有辦法的解決方案, 但有效:

// 關(guān)閉時(shí)調(diào)用注銷接口
window.onbeforeunload = function() {
 //執(zhí)行注銷ajax調(diào)用, 傳入標(biāo)志, 告訴后臺(tái)延時(shí)注銷
 $.ajax({url:"/logout"},data:{delay:true});
};

后臺(tái)注銷接口根據(jù)delay標(biāo)志, 設(shè)置定時(shí)器,進(jìn)行延時(shí)注銷, 比如設(shè)置5秒定時(shí)器,5秒后,才真正注銷應(yīng)用系統(tǒng)會(huì)話。

同時(shí),前端頁(yè)面加載后,要立刻調(diào)用一個(gè)清除注銷的接口, 告訴后臺(tái)刪除延時(shí)注銷定時(shí)器,確保刷新頁(yè)面時(shí)放棄之前的注銷操作,以保持應(yīng)用會(huì)話。

進(jìn)一步問(wèn)題

后臺(tái)定時(shí)器設(shè)置多少延時(shí)可靠? 當(dāng)然希望越短越好, 因?yàn)榭梢源_保用戶關(guān)閉瀏覽器后, 重新打開(kāi)頁(yè)面,不至于重新保持會(huì)話, 例如后臺(tái)設(shè)置5秒定時(shí)器, 用戶關(guān)閉瀏覽器, 重新打開(kāi)頁(yè)面之間間隔只要大于5秒, 則會(huì)話將不會(huì)恢復(fù), 確保重新進(jìn)入登陸頁(yè)面。 當(dāng)然,如果用戶手速過(guò)高,5秒內(nèi)重新打開(kāi)頁(yè)面,則會(huì)成功進(jìn)入上一個(gè)會(huì)話, 當(dāng)然這不會(huì)造成嚴(yán)重問(wèn)題, 因?yàn)閻阂庥脩舨豢赡芊浅?斓氖褂糜脩綦x開(kāi)的電腦并打開(kāi)頁(yè)面。

然后呢? 到底設(shè)置多少秒延時(shí)為好? 這取決于 前端代碼加載頁(yè)面時(shí)調(diào)用清除延時(shí)注銷定時(shí)器的時(shí)機(jī), 關(guān)鍵點(diǎn)是,越早越好。
如何越早呢? 當(dāng)然是 需要把此調(diào)用放在主頁(yè)的盡可能提前的代碼中,比如:

<html manifest="">
 <head>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta charset="UTF-8">
  <meta http-equiv="Pragma" content="no-cache">
  <meta http-equiv="Cache-Control" content="no-cache">
  <meta http-equiv="Expires" content="0">
  
  <script type="text/javascript">
   //為了盡快調(diào)用清除延時(shí)注銷定時(shí)器, 使用原始XMLHttpRequest方式進(jìn)行調(diào)用
   var xhr = new XMLHttpRequest();
   if (xhr) {
    xhr.open("POST", '/clearlogout', true);
    xhr.send();
   }
  </script>

  ......

經(jīng)過(guò)上述處理, 一般正常的網(wǎng)絡(luò)情況下, 刷新頁(yè)面操作可確保 調(diào)用延時(shí)注銷 和 清除延時(shí)注銷之間的時(shí)間間隔很短, 一般來(lái)說(shuō), 5秒是較為合理的延時(shí)值。
使用此機(jī)制的使用可根據(jù)偏好, 比如希望更安全,還是希望更確保刷新體驗(yàn), 來(lái)決定延長(zhǎng)還是縮短延時(shí)調(diào)用定時(shí)器。

需要注意問(wèn)題

顯然,上述機(jī)制必須依賴后端雙層會(huì)話機(jī)制,因?yàn)榍疤崾潜仨毷紫戎С炙⑿马?yè)面會(huì)話保持, 所以 表層是web框架本身的session, 內(nèi)層是應(yīng)用層會(huì)話。 表層會(huì)話依賴cookie,內(nèi)層應(yīng)用會(huì)話依賴后臺(tái)緩存機(jī)制或者數(shù)據(jù)庫(kù)

感謝各位的閱讀,以上就是“js關(guān)閉瀏覽器時(shí)退出賬號(hào)怎么處理”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)js關(guān)閉瀏覽器時(shí)退出賬號(hào)怎么處理這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

js
AI