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写此代码会有触发“关闭窗口”函数,还是大家都有~
最后删掉了此部分,改为进入页面的时候重置~
等后期有时间在优化吧~哈哈哈
哪位大神有什么好的方法或者建议,或者解决的办法欢迎来骚扰~