ie刷新页面,进入404 页面 ( {path:*,redirect:'/404'}页面)

在Vue项目中,使用动态路由时遇到IE浏览器特有的问题:刷新页面后跳转到404页面。经过排查,发现原因是由于在app.vue文件中设置的关闭页面清除cookie的代码在IE浏览器中刷新时被触发,导致动态路由信息丢失。解决方案是移除该代码,改为进入页面时重置cookie,避免刷新时清除关键路由信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue项目中用了动态路由,addRoutes(),谷歌,edge等其他浏览器都没问题,只有ie浏览器进入动态路由后,一刷新就会跳转到重定向的(redirect:’/404‘)。

过程是这样的:

1、登录接口获取到路有权限

2、去store中存储到state中,并通过cookie.js 存到cookie中

3、每次跳转页面判断是否存在角色路由(是否刷新丢失路由)

4、如丢失则去获取cookie中存储的角色权限,重新addroutes添加到路由表中

  • 登录接口获取权限 ,并保存到cookie中
//state中代码

const state = {
  roles: Cookies.get('roles') || '','
}

//mutations 触发代码
  SET_ROLES: (state, role) => {
    state.roles = role
    Cookies.set('roles', role)
  },

//接口 action中代码
loginZhdd({
    commit
  }, uid) {
    return new Promise((resolve, reject) => {
      loginZhdd({
        uid: uid
      }).then(response => {
        const {
          result
        } = response.data
        if (result.code == 200) {
          commit('SET_ROLES', res.jurisdiction)//触发mutation存储
          resolve(res)
        else {
          reject(result.message)
        }
      }).catch(error => {
        reject(error)
      })
    })
  },
  • 刷新时重新获取权限(cookie),添加到路由表中,并跳转
    //router.beforeEach(async(to, from, next) => {})中代码 
    try {
            accessRoutes = await store.dispatch('auth/getRoutes', logRoles)//获取路由
            accessRoutes.push(store.getters.lostway)//添加{path:'*',redirect:'/404'路由
            router.addRoutes(accessRoutes)//添加到路由表中
            next({
              path: to.fullPath,
              replace: true
            })
          } catch (error) {
            console.log(error)
          }

    ps:每次刷新之后,在控制台--缓存--查看cookie中,发现roles的值都为1(应该是' ’,不知道为什么ie value会显示为1,希望有了解的可以指点指点),以为是添加路由的问题,找了好久好久……

  • 最后不经意间发现,是app.vue文件中的一段代码导致的。代码如下:

<template>
  <!-- @mouseover="OperatingWebsite"  -->
  <div id="app">
    <!-- <div id="adv"> id werwrewr</div> -->
    <router-view />
  </div>
</template>

js部分

<script>
  import {
    removeToken
  } from "@/utils/auth";
  import {
    setTimeout,
    clearTimeout
  } from "timers";
  export default {
    name: "App",
    data() {
      return {
        timer: null, //节流限制OperatingWebsite函数执行的频率
        lastTime: null //记录上一次操作的时间
      };
    },
    mounted() {
      window.addEventListener('beforeunload', e => this.beforeunloadHandler(e))
      window.addEventListener('unload', e => this.unloadHandler(e))
    },
    destroyed() {
      window.removeEventListener('beforeunload', e => this.beforeunloadHandler(e))
      window.removeEventListener('unload', e => this.unloadHandler(e))
    },

    methods: {
      beforeunloadHandler() {
        this._beforeUnload_time = new Date().getTime();
      },
      unloadHandler(e) {
        this._gap_time = new Date().getTime() - this._beforeUnload_time;
        //判断是窗口关闭还是刷新
    //多说一句,再退出登录的时候用alert弹框并不会触发,所以你可以用debugger断点,或者用写入页面HTML标签中innerhtml来查看是否触发,在断点执行完innerhtml这行代码的时候,页面中对应id的内容会被改写。
//所以木有alert弹框,并不代表没进到下面代码内
        if (this._gap_time <= 5) {
          this.$store.dispatch("user/removeCook");
          // document.getElementById('adv').innerHTML = '8888888888';
        }
      },
       //退出页面,清空cookie
     // async logout() {
     //   await this.$store.dispatch("user/logout");
     //   this.$router.push(`/login?redirect=${this.$route.fullPath}`);
     // },
      //鼠标不操作页面,30分钟调转到登录页
      // OperatingWebsite() {
      //   const vm = this;
      //   if (vm.timer) {
      //     clearTimeout(vm.timer);
      //   }
      //   vm.timer = setTimeout(() => {
      //     //定时是为了节流限制
      //     const curTime = new Date().getTime();
      //     if (vm.lastTime && curTime - vm.lastTime > 1000 * 60 * 30) {
      //       //退出
      //       if (vm.$route.path == "/login") {
      //         vm.lastTime = curTime;
      //         return;
      //       } else {
      //         vm.logout();
      //       }
      //     } else {
      //       vm.lastTime = curTime;
      //     }
      //   }, 100);
      // }
    },
    created() {
      this.lastTime = new Date().getTime();
    }
  };

</script>

此处代码的本意是:关闭页面的时候,清空cookie值,刷新的时候不清空(因为我们项目从其他项目入口进,删掉了退出登录的按钮,所以我是想在关闭页面的时候清空cookie)。在Chrome等浏览器下是可以正常运行的。刷新的时候并不会清空。但是发现在ie浏览器中,刷新的时候就会触发,并会给我清空cookie里面的存储的东西,这就导致了每次刷新,都会重定向到404 页面。。。

问题终于找到了,坑到家了啊~~~~   

估计一般人不会这么巧的跟我一样因为此原因出现此问题,所以为自己记录一下吧~

不知道是只有我自己ie写此代码会有触发“关闭窗口”函数,还是大家都有~

最后删掉了此部分,改为进入页面的时候重置~

等后期有时间在优化吧~哈哈哈

哪位大神有什么好的方法或者建议,或者解决的办法欢迎来骚扰~

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值