前端路由权限拦截实战:Vue 与 React 三种方案对比
背景与痛点
在开发后台管理系统时,仅依赖后端接口权限校验往往不够。如果前端直接暴露敏感页面链接,未登录用户虽无法获取数据,但可能看到'无权访问'的报错或加载失败的骨架屏,甚至通过浏览器后退键绕过退出登录状态。此外,前端渲染后再调接口的延迟会导致用户体验下降。因此,需要在路由层面进行前置拦截,确保未授权用户无法访问受保护的路由。
路由保护机制原理
前端应用可视为一个小区,Router 是大门,Guard(守卫)是保安。主要分为三类:
- 全局前置守卫:监听所有路由变化,适合检查登录 Token,统一踢到登录页。Vue Router 中为
router.beforeEach。 - 独享守卫:针对特定路由配置,如
/admin需管理员权限。Vue Router 中为beforeEnter。 - 组件内守卫:在组件内部执行,适合进入后二次校验,如按钮级权限。Vue 中为生命周期钩子,React 中为
useEffect。
执行顺序通常为:全局前置 → 独享 → 组件内。
关于 Token 存储,LocalStorage 方便但易受 XSS 攻击;Cookie 设 HttpOnly 更安全但受大小限制且易受 CSRF 影响;SessionStorage 页面关闭即清。推荐 Access Token 放内存,Refresh Token 放 HttpOnly Cookie。
三种实现方案
方案一:全局拦截大法
适合 90% 的项目。思路是在路由跳转前统一检查登录状态。
Vue Router 实现:
// router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import routes from './routes'
import { getToken } from '@/utils/auth'
Vue.use(Router)
const router = new Router({
mode: 'history',
routes
})
router.beforeEach((to, from, next) => {
const hasToken = getToken()
(to. === ) {
()
}
(hasToken) {
()
} {
()
}
})
router


