sessionstorage仅用于缓存已由后端鉴权生成的动态路由表,不参与权限判定;权限检查必须由后端主导,前端仅做视图过滤与体验优化,登出时需手动清理以防止残留。

SessionStorage 可以在单次页面会话中安全缓存用户的动态路由表,但需注意:它只在当前浏览器标签页有效、不跨标签共享,且不参与服务端验证。权限检查必须仍由后端主导,前端仅做视图层过滤与快速渲染。
权限检查应在登录后由后端返回路由配置
动态路由表本质是权限的结构化表达,不应由前端自行拼凑。用户登录成功后,后端应根据其角色和资源权限,生成并返回经过校验的路由清单(如数组形式的路由对象),包含 path、name、component(或懒加载路径)、meta.requiresAuth 等字段。
- 返回前务必服务端鉴权,避免“越权返回”(例如普通用户不该看到 admin 路由)
- 建议对路由数据做简单签名或加密(如 JWT payload 内嵌),防止客户端篡改后伪造权限
- 前端收到后立即存入 sessionStorage.setItem('userRoutes', JSON.stringify(routes))
路由守卫中读取并注册动态路由
使用 Vue Router 或 React Router 时,在导航守卫(如 Vue 的 router.beforeEach)中检查 sessionStorage 是否已有合法路由数据;若无,则重定向到登录页或触发重新拉取。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
- 首次进入应用时,从 sessionStorage 读取:const routes = JSON.parse(sessionStorage.getItem('userRoutes') || '[]')
- 调用 router.addRoute()(Vue Router 4)或 router.addRoutes()(旧版)逐条添加,或使用 resetRouter() + addRoute() 替换整个路由表
- 注意:动态添加的路由不会自动触发视图更新,需确保组件能响应式感知(如配合 router.getRoutes() 或状态管理)
退出登录或会话过期时及时清理
SessionStorage 虽然随标签页关闭自动清除,但主动登出或 token 过期时必须手动清空,防止残留路由导致界面异常或误导航。
- 登出逻辑中执行:sessionStorage.removeItem('userRoutes')
- 建议同时清除其他敏感缓存项(如 userToken、userInfo)
- 可监听全局事件(如 storage 事件)辅助跨标签同步登出状态(非必需,但更健壮)
不依赖 sessionStorage 做权限判断,只作缓存载体
关键原则:路由是否显示 ≠ 用户是否有权访问。sessionStorage 中的数据可被用户轻易修改,因此所有真实权限控制必须落在服务端接口层面。
- 每个受保护 API 都应校验用户身份与操作权限(RBAC/ABAC),不能因前端渲染了某个菜单就认为后端该放行
- 前端路由守卫中可做轻量级白名单校验(如比对 path 是否在 sessionStorage 路由表中),仅为体验优化,失败时跳转 403 页面,不替代后端鉴权
- 敏感操作(如删除、导出)仍需二次确认 + 后端权限拦截
不复杂但容易忽略:sessionStorage 是客户端缓存手段,不是权限系统的一部分。它的价值在于减少重复请求、提升首屏体验,而非承担安全职责。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










