Vue /React implementa autenticação de roteamento/guarda de navegação/intercepção de roteamento (react-router v6)
1. Reagir ao projeto
1. Ideia de implementação
Encapsule AuthRoute
componentes de alto nível de autenticação de roteamento por conta própria, realize a interceptação sem login e pule para a página de login
A ideia é: julgue se existe um token localmente, se sim, retorne o subcomponente, caso contrário redirecione para Login
2. Etapas de implementação
-
No diretório de componentes, crie o arquivo AuthRoute/index.js
-
Determinar se deseja fazer login
-
Ao fazer login, renderize diretamente o componente de página correspondente
-
Redirecione para a página de login quando não estiver logado
-
Substitua a configuração de roteamento de página que requer autenticação pela renderização do componente AuthRoute
3. Implementação do código
/src/routes/AuthRoute.js
// 路由鉴权
// 1. 判断token是否存在
// 2. 如果存在 直接正常渲染
// 3. 如果不存在 重定向到登录路由
import { Navigate } from "react-router-dom";
// 高阶组件:把一个组件当成另外一个组件的参数传入 然后通过一定的判断 返回新的组件
// 这里的AuthRoute就是一个高阶组件
function AuthRoute({ children }) {
// 获取token
const tokenStr = window.localStorage.getItem('token');
// 如果token存在 直接正常渲染
if (tokenStr) {
return <>{children}</>
}
// 如果token不存在,重定向到登录路由
else {
return <Navigate to='/login' replace />
}
}
{/*
<AuthRoute> <Layout /> </AuthRoute>
登录:<> <Layout /> </>
非登录:<Navigate to="/login" replace />
*/ }
function LoginRoute({ children }) {
const token = window.localStorage.getItem('token');
if (token) {
return <Navigate to="/" replace></Navigate>;
} else {
return <>{children}</>;
}
}
export { AuthRoute,LoginRoute }
arquivo de tabela de roteamento src/routes/index.js
import Layout from "@/pages/Layout";
import Login from "@/pages/Login";
import { AuthRoute ,LoginRoute} from "@/routes/AuthRoute";
// eslint-disable-next-line
export default [
// 不需要鉴权的组件Login
{
path: "/login",
element: <LoginRoute>
<Login />
</LoginRoute>
},
// 需要鉴权的组件Layout
{
path: "/",
element: <AuthRoute>
<Layout />
</AuthRoute>
}
]
2. No projeto Vue
1. Ideia de implementação
No arquivo da tabela de roteamento do roteador do Vue, há uma API empacotada oficial: beforeEach
.
2. Implementação do código
/src/router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
// 路由懒加载
const Login = () => import(/* webpackChunkName: "login_home_welcome" */ '../components/Login.vue')
const Home = () => import(/* webpackChunkName: "login_home_welcome" */ '../components/Home.vue')
const Welcome = () => import(/* webpackChunkName: "login_home_welcome" */ '../components/Welcome.vue')
Vue.use(VueRouter)
const routes = [
{
path: '/login',
component: Login
},
{
path: '/',
redirect: '/login'
},
{
path: '/home',
component: Home,
redirect: '/welcome',
children: [
{ path: "/welcome", component: Welcome }
]
}
]
const router = new VueRouter({
routes
})
// 挂载路由导航守卫
router.beforeEach((to, from, next) => {
// to代表将要访问的路径
// from代表从哪个路径跳转而来
// next是一个函数,表示放行
// next() 放行 next('/login') 强制跳转到login页面
if (to.path === '/login') return next()
// 获取token
const tokenStr = window.sessionStorage.getItem('token')
if (!tokenStr) return next('/login')
next()
})
export default router
3. Explicação do código:
-
router.beforeEach é usado para definir o guarda de navegação de rota do Vue (interceptação de rota), que recebe uma função de retorno de chamada como parâmetro.
-
Dentro da função callback, três parâmetros são recebidos em ordem: to, from, next.
-
to representa o caminho a ser acessado
-
from representa de qual caminho pular
-
next é uma função que significa liberar
-
next() => release, next('/login') => forçado a pular para a página de login