最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue用戶長時間不操作退出到登錄頁的兩種實現(xiàn)方式

 更新時間:2021年09月18日 10:35:34   作者:水冗水孚  
出于安全考慮,用戶長時間不操作,就回到登錄頁面,讓用戶重新登錄,本文就記錄一下實現(xiàn)這種效果的兩種方式,具有一定的參考價值,感興趣的可以了解一下

問題描述

產(chǎn)品說,出于安全考慮,用戶長時間不操作,就回到登錄頁面,讓用戶重新登錄,就像銀行的app一樣。本文就記錄一下實現(xiàn)這種效果的兩種方式,分別是前端控制和后端控制,各有細節(jié)及適用使用場景

前端控制(方式一)

思路

首先,用戶長時間不操作具體表現(xiàn)形式是啥?其實就是事件是否長時間沒有被觸發(fā)執(zhí)行。

比如用戶長時間不操作,就沒有鼠標點擊(click)事件、鼠標滾輪(mousewheel)事件、鼠標移動(mousemove)事件之類的,我們只需要監(jiān)聽這些事件,如果這些事件長時間沒有觸發(fā),就說明用戶長時間未操作,然后路由跳轉到登錄頁面即可。

這三個事件我選擇的是比較實用的鼠標點擊事件,我們知道,一般來說項目的第一個頁面是登錄頁面,所以在登錄頁面用戶點擊登錄按鈕的時候,就記錄一下點擊登錄按鈕的時間,存儲到sessionstorage中去,當跳轉到主頁面的時候,當用戶每點擊一次頁面,就更新一下sessionstorage中的存儲的時間,同時也給頁面綁定一個循環(huán)定時器,間隔一段時間就把當前時間和sessionstorage儲存的上一次點擊事件的時間做一個差值對比,當差值超過一定時間,就強制用戶退出到登錄頁面即可。

代碼

login.vue頁面

// html
<el-button type="primary" @click="loginIn">點擊登錄</el-button>

// js
methods: {
    loginIn() {
      // 存第一份點擊的時間
      sessionStorage.setItem("lastClickTime", new Date().getTime());
      // 模擬后端返回存一個token
      sessionStorage.setItem('token',"token")
      this.$router.push({
        path: "/",
      });
    },
}

Home.vue頁面

<template>
  <div class="homeBox">
    <!-- 左邊是菜單層級 -->
    <div class="left">
      <div class="leftNav">
        <el-menu
          :default-active="activeIndex"
          class="elMenu"
          background-color="#333"
          text-color="#B0B0B2"
          active-text-color="#fff"
          :unique-opened="true"
          router
          ref="elMenu"
        >
          <el-menu-item index="/vue">
            <i class="el-icon-location-outline"></i>
            <span slot="title">vue頁面</span>
          </el-menu-item>
          <el-menu-item index="/react">
            <i class="el-icon-star-off"></i>
            <span slot="title">react頁面</span>
          </el-menu-item>
          <el-menu-item index="/angular">
            <i class="el-icon-pear"></i>
            <span slot="title">angular頁面</span>
          </el-menu-item>
        </el-menu>
      </div>
    </div>
    <!-- 右邊是視圖層級 -->
    <div class="right">
      <div class="rightTop">
        <el-button type="primary" plain @click="loginOut">登出</el-button>
      </div>
      <div class="rightBottom">
        <router-view></router-view>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "Home",
  data() {
    return {
      activeIndex: this.$route.path,
      timer: null,
    };
  },
  created() {
    /* 
      第一步:
        組件初始化加載就綁定監(jiān)聽點擊事件,注意:addEventListener的第三個參數(shù),這里要加上。
        因為第三個參數(shù)決定了是冒泡還是捕獲(false冒泡默認,true捕獲),因為綁定監(jiān)聽點擊事件,我們是在最
        頂層的DOM位置進行捕獲點擊事件,所以第三個參數(shù)true,要加上的,這樣的話,內層的任意地方的點擊事件
        我們就都能監(jiān)聽到了,然后存儲一下點擊的時間
    */
    window.addEventListener(
      "click",
      () => {
        // 為了方便,我們把點擊事件的時間直接存到sessionStorage中去,這樣方便獲取比較
        sessionStorage.setItem("lastClickTime", new Date().getTime());
      },
      true
    );
  },
  mounted() {
    /*
      第二步:
        組件初始化加載時也要綁定一個定時器,通過定時器定時輪詢,去對比當前時間和上次點擊的時間的差值
    */
    this.isTimeOut();
  },
  methods: {
    isTimeOut() {
      // 使用定時器之前,要清除一下定時器
      clearInterval(this.timer);
      this.timer = setInterval(() => {
        let lastClickTime = sessionStorage.getItem("lastClickTime") * 1; // 把上次點擊時候的字符串時間轉換成數(shù)字時間
        let nowTime = new Date().getTime(); // 獲取當前時間
        console.log("當前時間和之前點擊時間", nowTime, lastClickTime);
        // 假設我們需求是:5秒鐘不進行點擊操作,就提示登錄退出
        if (nowTime - lastClickTime > 1000 * 5) {
          // 提示一下用戶
          this.$message({ type: "warning", message: "超時了,已退出登錄" });
          // 這里要清除定時器,結束任務
          clearInterval(this.timer);
          // 最后返回到登錄頁
          this.$router.push({ path: "/login" });
        }
      }, 1000);
    },
  },
  beforeDestroy() {
    // 最后一步,離開頁面的時候,清除一下定時器,也解綁點擊事件
    clearInterval(this.timer);
    window.removeEventListener("click", () => {}, true);
  },
};
</script>

這里注意一下,層級對應關系,我項目搭建的層級關系是Home.vue頁面是App.vue頁面的里面一層,也有對應的視圖,視圖對應的也是整個頁面的關系。根據(jù)層級和路由表路由視圖router-view關系,選擇合適的層級去綁定對應的點擊事件和定時器即可。

即層級關系是要選擇和login.vue層級平行的下一級才行,否則就會在login.vue頁面也會執(zhí)行定時器和點擊綁定事件了

效果圖

后端控制(方式二)

思路

這種后端控制方式限制性沒有前端控制強,但是也是可以用的。
我們知道用戶長時間不操作就不會有發(fā)請求,這種方式我們和后端商定如下:
當用戶這一次的請求和上一次請求的間隔時間超過一定時間,比如超過半小時。那么后端返回的狀態(tài)碼就不是200了,就是一個特殊的狀態(tài)碼,比如是4567這個狀態(tài)碼,那么我們在前端的響應攔截器中就可以加一個判斷,如果狀態(tài)碼是4567就說明請求超時了,說明用戶長時間未操作,這個時候直接路由跳轉到登錄頁面即可

后端通過JWT機制去控制返回的狀態(tài)碼

代碼

這里main.js中的Vue的實例對象我們將其掛載到全局對象window上,方便我們在響應攔截器中使用vm對象上的路由跳轉方法

main.js文件

// 掛載到window對象上
window.vm = new Vue({
    store,
    router,
    render: h => h(App),
}).$mount('#app')

響應攔截器文件

http.interceptors.response.use((res) => {
    console.log('注冊到全局上',vm);
    var code = res.data.code;
    if(code == 4567){ // 4567是超時狀態(tài)碼,看到這個標識我們就讓用戶退出登錄
        // 注意,這個時候路由跳轉就不是this.$router.push()了
        vm._router.push({ path: "/login" });
    }
    return res.data
}, (error) => {
    // console.log(error)
    return Promise.reject(error);
})

打印vm實例對象

所以在響應攔截器中路由跳轉變成了vm._router.push({ path: "/login" })了

總結

上述兩種方式的思路都可以使用,具體使用哪種方式,視情況而定

到此這篇關于vue用戶長時間不操作退出到登錄頁的兩種實現(xiàn)方式的文章就介紹到這了,更多相關vue用戶長時間不操作退出內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Vue3 elementUI 中 date-picker 使用過程遇到坑

    Vue3 elementUI 中 date-picker 使用過程遇到坑

    這篇文章主要介紹了Vue3 elementUI 中 date-picker 使用過程遇到坑,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-10-10
  • vue使用Element el-upload 組件踩坑記

    vue使用Element el-upload 組件踩坑記

    這篇文章主要介紹了vue使用Element el-upload 組件的相關知識,在研究學習基本使用的過程中遇到很多問題,今天特此把問題記錄分享到腳本之家平臺,需要的朋友可以參考下
    2021-09-09
  • Vue Promise的axios請求封裝詳解

    Vue Promise的axios請求封裝詳解

    這篇文章主要介紹了Vue Promise的axios請求封裝詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • vue-draggable實現(xiàn)pc端拖拽效果

    vue-draggable實現(xiàn)pc端拖拽效果

    這篇文章主要為大家詳細介紹了vue-draggable實現(xiàn)pc端拖拽效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue3實現(xiàn)無縫滾動組件的示例代碼

    vue3實現(xiàn)無縫滾動組件的示例代碼

    在日常開發(fā)中,經(jīng)常遇到需要支持列表循環(huán)滾動展示,特別是在數(shù)據(jù)化大屏開發(fā)中,所以小編今天為大家介紹一下如何利用vue3實現(xiàn)一個無縫滾動組件吧
    2023-09-09
  • 使用Bootstrap + Vue.js實現(xiàn)表格的動態(tài)展示、新增和刪除功能

    使用Bootstrap + Vue.js實現(xiàn)表格的動態(tài)展示、新增和刪除功能

    這篇文章主要介紹了使用Bootstrap + Vue.js實現(xiàn)表格的動態(tài)展示、新增和刪除功能,需要的朋友可以參考下
    2017-11-11
  • vue2.0的計算屬性computed和watch的區(qū)別及各自?使用場景解讀

    vue2.0的計算屬性computed和watch的區(qū)別及各自?使用場景解讀

    這篇文章主要介紹了vue2.0的計算屬性computed和watch的區(qū)別及各自?使用場景,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 基于vue實現(xiàn)循環(huán)滾動列表功能

    基于vue實現(xiàn)循環(huán)滾動列表功能

    這篇文章給大家介紹基于vue實現(xiàn)循環(huán)滾動列表功能,給大家介紹了該組件的用法,通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-09-09
  • Vue3和i18n實現(xiàn)多語言方式

    Vue3和i18n實現(xiàn)多語言方式

    這篇文章主要介紹了Vue3和i18n實現(xiàn)多語言方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • vue2使用ts?vue-class-component的過程

    vue2使用ts?vue-class-component的過程

    vue-property-decorator?是一個?Vue.js?的裝飾器庫,它提供了一些裝飾器來讓你在?Vue?組件中定義屬性、計算屬性、方法、事件等,本文給大家介紹vue2使用ts?vue-class-component的相關知識,感興趣的朋友一起看看吧
    2023-11-11

最新評論

瑞昌市| 丰顺县| 嵊州市| 西宁市| 辰溪县| 孟津县| 阳原县| 建昌县| 武夷山市| 竹山县| 麻栗坡县| 洛阳市| 乐清市| 綦江县| 娱乐| 武义县| 绍兴县| 昆山市| 资溪县| 深水埗区| 宜丰县| 河曲县| 崇仁县| 涞水县| 沧源| 泰兴市| 铜陵市| 正定县| 安新县| 赣州市| 乐东| 邻水| 长岛县| 都兰县| 噶尔县| 长兴县| 资讯 | 安吉县| 昭觉县| 德保县| 珠海市|