Vue-router-路由守卫

Vue-路由守卫

路由守卫有点像是Java中的Filter过滤器,它可以在路由页面切换前后去执行一些功能代码

  • 全局前置守卫:在路由切换前被调用,可以用于验证用户登录、中断导航、请求数据等
  • 全局后置守卫:在路由切换之后被调用,可以用于处理数据、操作Dom、记录日志等

守卫代码写在 router.js文件中


全局守卫

每次路由切换页面前,都会执行beforeEach中的回调函数

回调函数提供三个参数:

  • to:下一个页面,到哪里去

  • from:上一个页面,从哪里来

  • next:放行的方法,只有执行了该方法,才会放行路由

    • next():放行
    • next(/路径):路径的重定向
    • 为避免死循环问题,必须在判断分支下使用next(/路径)对路由进行重定向

这三个参数的顺序不能变,一定得是to,from,next

next()的作用就像是filter中的filterChain.doFilter(servletRequest, servletResponse);

to和from是两个对象,调用其path属性即可打印路径

全局前置守卫
router.beforeEach(
    (to, from, next) => {
        console.log(to.path)
        console.log(from.path)
        next()
    }
)
全局后置守卫
router.afterEach(
    (to, from) => {

    }
)

守卫练习

Login.vue

建立登陆组件,写一些功能

<script setup>
import { ref } from 'vue';
let username = ref("")
let password = ref("")

import {useRouter} from "vue-router"
const router = useRouter()
// 获取用户名和密码 匹配后则跳转 /home
// 登陆失败,不跳转页面
function login(){
    if(username.value == "xiaobai" && password.value == "123456"){
        //路由跳转 /home
        router.push("/home")
        //将用户名保存在浏览器上
        window.sessionStorage.setItem("username",username.value)
    }else{
        alert("用户名或者密码错误")
    }
}
</script>

<template>
  <div>
      账号: <input type="text" v-model="username"> <br>
      密码: <input type="password" v-model="password">
      <button @click="login()">登录</button>
  </div>
</template>

<style scoped>

</style>

Home.vue

建立一个home组件,写一些功能

<script setup>
import {useRouter} from "vue-router"
const router = useRouter()

let username = window.sessionStorage.getItem("username")

function logout(){
    // 清除sessionStore中的用户登录信息
    window.sessionStorage.removeItem("username")
    // 跳转到Login视图
    router.push("/login")
}

</script>

<template>
  <div>
      <h1>home页面</h1>
      <h3>欢迎{{username}}登录</h3>
      <button @click="logout">退出登录</button>
  </div>
</template>

<style scoped>

</style>

router.js

建立router.js,编写路由规则和路由守卫

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

import Login from '../components/Login.vue'
import Home from '../components/Home.vue'
const router = createRouter({
    history:createWebHashHistory(),
    routes:[
        {
            path:"/home",
            component:Home
        },
        {
            path:"/login",
            component:Login
        }
    ]
}
)

//通过路由的前置守卫控制校验登录
router.beforeEach((to, from, next) => {
    if (to.path == '/login') {
        //判断如果是登录,就直接放行即可
        next();
    }else{
        //如果是其他资源,都要在登陆之后才放行,如果没登陆,则重定向到登陆视图
        const username = sessionStorage.getItem("username")
        if(null != username)
            next()
        else{
            next("/login")
        }
    }
    
});
export default router