vue中,401页面——您没有权限访问当前页面,直接跳转登录页

vue中,401页面——您没有权限访问当前页面,直接跳转登录页

效果

在这里插入图片描述

代码
1、页面

src\components\errorPage\401page.vue

<template>
  <div style="height:100%;">
    <div class="wscn-http404">
      <div class="pic-404">
        <img class="pic-404__parent" :src="img_404" alt="404">
        <img class="pic-404__child left" :src="img_404_cloud" alt="404">
        <img class="pic-404__child mid" :src="img_404_cloud" alt="404">
        <img class="pic-404__child right" :src="img_404_cloud" alt="404">
      </div>
      <div class="bullshit">
        <div class="bullshit__oops">OOPS!</div>
        <!--    <div class="bullshit__info">版权所有
              <a class='link-type' href='https://wallstreetcn.com' target='_blank'>华尔街见闻</a>
            </div>
            <div class="bullshit__headline">{{ message }}</div>-->
        <div class="bullshit__info">您没有权限访问当前页面,<span class="bullshit__return-second">{{second}}</span> &nbsp;秒后直接跳转登录页面</div>
        <!-- <a href="/" class="bullshit__return-home">返回首页</a>-->
        <el-button @click="back" icon='arrow-left' class="bullshit__return-home">直接跳转登录</el-button>
      </div>
    </div>
  </div>
</template>

<script>
import { useUserStore } from '@/store/index.js'
import { ref, inject } from "vue";
import img_404 from '@/assets/401_images/401.png'
import img_404_cloud from '@/assets/404_images/404_cloud.png'
import * as allCookie from '../../utils/utils.js';

  export default {
    name: 'error_401',
    data() {
      return {
        img_404,
        img_404_cloud,
        second:5,
        interval:"",
        iscLoginOutPath: inject('iscLoginOutPath')
      }
    },
    methods:{
      back() {
        if(this.isIsc){ //isc
          var that = this;
          this.$http.post(process.env.VUE_APP_API_HOST+ '/isc/iscLogout',{
            "isc":"web"
          }).then(function () {
            that.$router.push("/homePage");
            //        window.sessionStorage.clear();
            if(window.sessionStorage.getItem('userId')) {
              window.sessionStorage.removeItem('roles');
              window.sessionStorage.removeItem('tokenId');
              window.sessionStorage.removeItem('userName');
              window.sessionStorage.removeItem('userId');
              window.sessionStorage.removeItem('status');
              window.sessionStorage.removeItem('isSgcc');
              window.sessionStorage.removeItem('Web-Token');
              window.sessionStorage.removeItem('ser');
              window.sessionStorage.removeItem('userRealName');
              window.sessionStorage.removeItem('deptname');
              window.sessionStorage.removeItem('parentName');
              window.sessionStorage.removeItem('parentId');
            }
            window.sessionStorage.getItem('tokenId')?window.sessionStorage.removeItem('tokenId'):'';
            allCookie.CookieRemove('web_token');
          })
          let str = window.location.href;
          let routerIndex = str.lastIndexOf("#");
          let url = str.substr(0,routerIndex); //获取路由
          window.location.href = this.iscLoginOutPath + '?service=' + url + "#/homePage";
        }else{  //轻量级
          this.$router.push({path: '/login'});
        }
      },
      clearSessionAndCookie(){
        //        window.sessionStorage.clear();
        if(window.sessionStorage.getItem('userId')) {
          window.sessionStorage.removeItem('roles');
          window.sessionStorage.removeItem('tokenId');
          window.sessionStorage.removeItem('userName');
          window.sessionStorage.removeItem('userId');
          window.sessionStorage.removeItem('status');
          window.sessionStorage.removeItem('isSgcc');
          window.sessionStorage.removeItem('Web-Token');
          window.sessionStorage.removeItem('ser');
          window.sessionStorage.removeItem('userRealName');
          window.sessionStorage.removeItem('deptname');
          window.sessionStorage.removeItem('parentName');
          window.sessionStorage.removeItem('parentId');
        }
        window.sessionStorage.getItem('tokenId')?window.sessionStorage.removeItem('tokenId'):'';
        allCookie.CookieRemove("web_token");
        
        // 写法二
        // const userStore = useUserStore() 
        // userStore.userName = undefined;
        // userStore.userType = undefined;

        // console.log(999,this.$store);  写法一
        // this.$store.state.userName = undefined;
        // this.$store.state.userType = undefined;
      }
    },
    created(){
      this.clearSessionAndCookie();
      this.interval = setInterval(() => {
        this.second--;
        if (this.second === 0) {
          this.back();
        }
      }, 1000);
    },
    destroyed(){
      clearInterval(this.interval);
    }
  }
</script>

<style rel="stylesheet/scss" lang="scss" scoped>
  .wscn-http404 {
    position: relative;
    width: 1200px;
    margin: 20px auto 60px;
    padding: 0 100px;
    overflow: hidden;
    .pic-404 {
      position: relative;
      float: left;
      width: 600px;
      padding: 150px 0;
      overflow: hidden;
      &__parent {
        width: 100%;
      }
      &__child {
        position: absolute;
        &.left {
          width: 80px;
          top: 17px;
          left: 220px;
          opacity: 0;
          animation-name: cloudLeft;
          animation-duration: 2s;
          animation-timing-function: linear;
          animation-fill-mode: forwards;
          animation-delay: 1s;
        }
        &.mid {
          width: 46px;
          top: 10px;
          left: 420px;
          opacity: 0;
          animation-name: cloudMid;
          animation-duration: 2s;
          animation-timing-function: linear;
          animation-fill-mode: forwards;
          animation-delay: 1.2s;
        }
        &.right {
          width: 62px;
          top: 100px;
          left: 500px;
          opacity: 0;
          animation-name: cloudRight;
          animation-duration: 2s;
          animation-timing-function: linear;
          animation-fill-mode: forwards;
          animation-delay: 1s;
        }
        @keyframes cloudLeft {
          0% {
            top: 17px;
            left: 220px;
            opacity: 0;
          }
          20% {
            top: 33px;
            left: 188px;
            opacity: 1;
          }
          80% {
            top: 81px;
            left: 92px;
            opacity: 1;
          }
          100% {
            top: 97px;
            left: 60px;
            opacity: 0;
          }
        }
        @keyframes cloudMid {
          0% {
            top: 10px;
            left: 420px;
            opacity: 0;
          }
          20% {
            top: 40px;
            left: 360px;
            opacity: 1;
          }
          70% {
            top: 130px;
            left: 180px;
            opacity: 1;
          }
          100% {
            top: 160px;
            left: 120px;
            opacity: 0;
          }
        }
        @keyframes cloudRight {
          0% {
            top: 100px;
            left: 500px;
            opacity: 0;
          }
          20% {
            top: 120px;
            left: 460px;
            opacity: 1;
          }
          80% {
            top: 180px;
            left: 340px;
            opacity: 1;
          }
          100% {
            top: 200px;
            left: 300px;
            opacity: 0;
          }
        }
      }
    }
    .bullshit {
      position: relative;
      float: left;
      width: 330px;
      padding: 180px 0;
      overflow: hidden;
      &__oops {
        font-size: 32px;
        font-weight: bold;
        line-height: 40px;
        color: #1482f0;
        opacity: 0;
        margin-bottom: 20px;
        animation-name: slideUp;
        animation-duration: 0.5s;
        animation-fill-mode: forwards;
      }
      &__headline {
        font-size: 20px;
        line-height: 24px;
        color: #1482f0;
        opacity: 0;
        margin-bottom: 10px;
        animation-name: slideUp;
        animation-duration: 0.5s;
        animation-delay: 0.1s;
        animation-fill-mode: forwards;
      }
      &__info {
        font-size: 13px;
        line-height: 21px;
        color: grey;
        opacity: 0;
        margin-bottom: 30px;
        animation-name: slideUp;
        animation-duration: 0.5s;
        animation-delay: 0.2s;
        animation-fill-mode: forwards;
      }
      &__return-second{
        color:red;
      }
      &__return-home {
        display: block;
        float: left;
        width: 130px;
        height: 36px;
        background: #1482f0;
        border-radius: 100px;
        text-align: center;
        color: #ffffff;
        opacity: 0;
        font-size: 14px;
        /* line-height: 36px;*/
        cursor: pointer;
        animation-name: slideUp;
        animation-duration: 0.5s;
        animation-delay: 0.3s;
        animation-fill-mode: forwards;
      }
      @keyframes slideUp {
        0% {
          transform: translateY(60px);
          opacity: 0;
        }
        100% {
          transform: translateY(0);
          opacity: 1;
        }
      }
    }
  }
</style>
2、路由

src\router\index.ts

import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router';

type NewRouteRecordRaw = RouteRecordRaw & {
  redirect?: string
}

const routes: Array<RouteRecordRaw> = [
  // 404页面
  {
    path: '/errorPage',
    name: 'ErrorPage',
    component: () => import('@/components/errorPage/404page.vue'),
  },
  // 401页面
  {
    path: '/401',
    name: '401',
    component: () => import('@/components/errorPage/401page.vue'),
  },
    //如需点击返回首页的路由跳转homePage
  {
    path: '/',
    name: 'home',
    redirect: '/homePage',
  },
  // 首页
  {
    path: '/homePage',
    name: 'homePage',
    component: () => import('@/views/homePage.vue')
  },
    // 登录
  {
    path: '/login',
    name: 'Login',
    component: () => import('@/views/myCenter/accountManagement/loginRegister/login.vue')
  },
]

const router = createRouter({
  history: createWebHashHistory(),
  routes,
  scrollBehavior(to, from, savedPosition) {
    return { left: 0, top: 0 }
  }
})

export default router

src\main.ts

import router from './router'
app.use(router)

router.beforeEach((to, from, next) => {})

const getConfigJson = function () {
  axios.get('serverConfig.json')
    .then((result) => {
      app.provide('iscLoginPath',result.data.iscLoginPath)
      app.provide('iscLoginOutPath',result.data.iscLoginOutPath)
      app.provide('isIsc',result.data.isIsc)
      app.provide('encryptSign',result.data.encryptSign)
      isIsc = result.data.isIsc
      app.mount('#app')
    }).catch((error) => {
      console.log(error)
    })
};
getConfigJson()//调用声明的全局方法

public\serverConfig.json

{
  "iscLoginPath":"http://xdld.baidu.com:22002/idc_sos/login",
  "iscLoginOutPath":"http://xdld.baidu.com:22002/idc_sos/logout",
  "isIdc":true,
  "isAddSecure":false,
  "encryptSign": true  
}
3、配置页面

src\utils\utils.js

/*
 *
 * CookieRemove  name是字段   删除这个cookie
 *
 * */
export function CookieRemove(name) {
  CookieSet(name, null, -1);
}

src\store\index.js

import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
    state: () => ({
        count: 123,
        isTrue: true,
        isFalse: true,
        siteId: sessionStorage.getItem("siteId"),  //专区Id
        newsNumber: "",  //消息数
        doubleNum: 1,  //history回退
        navIndex: "",  //导航索引
        navs: [],  //导航菜单
        userName: sessionStorage.getItem("userName"), //用户名
        userType: sessionStorage.getItem("userType"),  //用户类型
        companyType: sessionStorage.getItem("companyType"),  //用户角色
        accountName: sessionStorage.getItem("accountName"),  //
        manualSync: sessionStorage.getItem("manualSync"),  //
        prefectureCode:sessionStorage.getItem('prefectureCode'),
        ZqName:sessionStorage.getItem('ZqName'),
        childMeunId:sessionStorage.getItem('childMeunId'),
        fromRoute:'',
        navsList:[]
    }),
    actions: {
        increment() {
            this.count++
        },
        decrement() {
            this.count--
        },
        changeUserName() {
            this.userName = sessionStorage.getItem('userName')
        },
        getUserType() {
            this.userType = sessionStorage.getItem('userType')
        },
        setCompanyType() {
            this.companyType = sessionStorage.getItem('companyType')
        },
        getAccountName() { 
            this.accountName = sessionStorage.getItem('accountName') 
        },
        getManualSync() { 
            this.manualSync = sessionStorage.getItem('manualSync') 
        },
        getSiteId() { 
            this.siteId = sessionStorage.getItem('siteId') 
        },
        getPrefectureCode() { 
            this.prefectureCode = sessionStorage.getItem('prefectureCode') 
        },
        getZqName() { 
            this.ZqName = sessionStorage.getItem('ZqName') 
        },
        getChildMeunId(){
            this.childMeunId = sessionStorage.getItem('childMeunId')
        }
        //从专区获取的id存储在state中
        // getId: function (state, id) {
        //   state.siteId = id || 0;
        // },
    }
})
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当检测到页面没有Token时,可以使用Vue路由守卫来实现跳转登录页面,具体代码如下:router.beforeEach((to, from, next) => {if (!token) {next({ path: '/login' })} else {next()}}) ### 回答2: 在Vue,可以通过路由守卫来控制页面访问权限。当页面没有Token时,可以通过路由守卫来自动跳转登录。 首先,需要在项目安装vue-router,可以使用以下命令进行安装: ``` npm install vue-router ``` 然后,在路由配置文件设置路由守卫。假设登录的路由路径为"/login",可以在全局前置守卫判断页面是否有Token,如果没有,则自动跳转登录。代码如下: ```javascript // 导入VueVue-router import Vue from 'vue' import VueRouter from 'vue-router' // 安装Vue-router Vue.use(VueRouter) // 创建路由实例 const router = new VueRouter({ // 路由配置 routes: [ // 其他页面的路由配置 ... { path: '/login', component: Login } ] }) // 全局前置守卫 router.beforeEach((to, from, next) => { // 判断是否有Token const token = localStorage.getItem('token') // 假设Token保存在localStorage if (token) { // 有Token,允许访问页面 next() } else { // 没有Token,跳转登录 next('/login') } }) // 导出路由实例 export default router ``` 在上述代码,我们在全局前置守卫判断是否存在Token,如果存在,可以访问页面,如果不存在,会跳转到"/login"页面。 当访问其他需要权限页面时,会先经过全局前置守卫,根据Token的存在与否执行相应的跳转逻辑。 ### 回答3: Vue路由守卫是一种在导航过程控制页面访问权限的方法。当我们使用Vue架开发前端应用时,可以通过路由守卫来监测用户是否具有正确的登录凭证(如Token),如果没有,则可以将用户重定向到登录。 下面是一个简单的示例代码,展示了如何使用Vue路由守卫来实现上述功能: 在main.js文件,我们需要引入VueVue Router,并创建一个Vue实例,并使用Vue Router配置路由。 ``` import Vue from 'vue' import VueRouter from 'vue-router' import App from './App.vue' Vue.use(VueRouter) // 定义路由 const routes = [ { path: '/login', component: Login }, { path: '/dashboard', component: Dashboard } ] // 创建路由实例 const router = new VueRouter({ routes }) // 添加路由守卫 router.beforeEach((to, from, next) => { const token = localStorage.getItem('token') // 假设我们的Token存在localStorage // 如果用户访问的是登录,则直接放行 if (to.path === '/login') { next(); } else { // 如果用户已经登录,则继续导航 if (token) { next(); } else { // 如果用户没有登录,则跳转登录 next('/login'); } } }) // 创建Vue实例并挂载Router new Vue({ router, render: h => h(App) }).$mount('#app') ``` 在上述代码,我们首先定义了两个路由,一个是登录(Login),一个是仪表盘(Dashboard)。然后根据用户是否具有Token来控制页面访问权限,在beforeEach导航守卫进行判断。如果用户访问的是登录,则直接放行,否则再判断用户是否已经登录。如果用户已经登录,则继续导航到目标页面,否则将用户重定向到登录。 这样,当页面没有Token时,就会自动跳转登录

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值