背景:因为系统对接了SSO,所以除了手动走/login页面能进入本来系统的登录页之外,其他URL都会自动进入SSO登录页,包括走根目录也会进入SSO登录页,经理想让走根目录进入本系统的登录页
原本加了SSO的登录拦截:
router.beforeEach((to, from, next) => {
iView.LoadingBar.start();
let hasLogin = false;
var token = sessionStorage.getItem('token');
var loginInfo = sessionStorage.getItem('loginInfo');
var url="SSO登录路径";
if (token !== undefined && token !== null && loginInfo !== undefined && loginInfo !== null) {
hasLogin = true;
}
if(to.name === 'reset' && to.query.tableid){
Util.toDefaultPage([...routers], to.name, router, next);
}else if(to.name === 'homework' && to.query.s){
Util.toDefaultPage([...routers], to.name, router, next);
}else if (to.name === 'SSOlogin' && to.query.spId && to.query.code){ //将接收url空白页放行
Util.toDefaultPage([...routers], to.name, router, next);
}
else if (!hasLogin && to.name !== 'login') { // 判断是否已经登录且前往的页面不是登录页
window.location.href = url;
} else if (hasLogin && to.name === 'login') { // 判断是否已经登录且前往的是登录页
next({
name: 'homework'
});
} else {
Util.toDefaultPage([...routers], to.name, router, next);
}
});
可以看到原本只对除了/login的路径进行拦截到SSO登录页,现在只需要加上一句判断,把根目录放入判断的白名单就能完成功能
第一次修改:本来我认为错了, 因为经理给我看了一段路径,是进入生产环境的,我就以为是走单独域名的时候要走本系统页
所以就加了个判断
else if(!hasLogin && to.fullpath === '域名' ){ //判断是否是从根路径进入url
next({
name: 'login'
});
}
当我跟经理说我做好了的时候,经理回:“测试环境试下”,我就想了一下,回:这段路径不是进入生产环境的路径吗?那不是应该在生产环境才生效嘛?
经理:不是根路径吗?那无所谓环境的吧? 这时,我就反应过来了,根路径!也就是只有端口名和端口号的URL
第二次修改:然后我就想到了vue 获取当前URL的方法
然后就用了 window.location.origin 获取路径前面的url
else if((!hasLogin && window.location.origin === '本地域名') || (!hasLogin && window.location.origin === '测试环境域名')|| (!hasLogin && window.location.origin === '生产环境域名')){ //判断是否是从根路径进入url
next({
name: 'login'
});
}
然后经理说:你这样子写是错的,这个功能是不能绑定固定url的,然后我debugger测试了一下,发现根目录的to.path都是 '/'
第三次修改: 于是最后加了判断
else if(!hasLogin && to.path === '/'){ //判断是否是从根路径进入url
next({
name: 'login'
});
}
用本地环境测试和用测试环境测试都通过了,经理测试也测试过了
解决 !