• 登录业务实现 - token登录鉴权


     登录业务实现:

    登录成功/失败实现  ->  pinia管理用户数据及数据持久化  ->  不同登录状态的模板适配   ->  请求拦截器携带token(登录鉴权  ->  退出登录实现  ->  token失效(401响应拦截)


     

    1. 登录成功/失败实现

    表单校验通过时,封装登录接口,调用登录接口,分别处理 登录成功和登陆失败的情况。

    登录成功,则提示用户,并跳转首页

    登录失败,报错。-> 拦截器统一报错(配置一次 多接口生效)

    2. pinia管理用户数据及数据持久化

    因为用户数据可能在多组件中进行共享,使用 pinia对用户数据进行管理。与数据有关的操作置于pinia中,组件只负责触发action函数

    (1) pinia管理数据 

    1. // 定义store
    2. export const useUserStore = defineStore('模块名', ()=>{
    3. // 1. 定义state
    4. const userInfo = ref({})
    5. // 2. 定义action
    6. const getUserInfo = () => {
    7. ...
    8. }
    9. // 3. 以对象的形式return state/action
    10. return {
    11. ...
    12. }
    13. })
    1. // 使用store
    2. import { useXXXStore } from '@/stores/XXXStore'
    3. const xxXStore = useXXXStore()
    4. xxXStore.getXX()

     (2)持久化用户数据

    token:用户数据中 用于标识当前用户是否登录,持续一段时间会过期。

    由于pinia是基于内存的,刷新会丢失,为保持登陆状态(刷新不丢失),要配合持久化进行存储

    -> 操作state时,自动把用户数据在本地的localStore中也存一份,(刷新时 从localStore中先取

    操作步骤:

    1)安装插件包: npm i pinia-plugin-persistedstate

    2)注册插件:

    1. // main.js 入口文件中
    2. const pinia = createPinia()
    3. pinia.use(piniaPluginPersistedState)

    3)持久化配置 存入localStore:

    1. // 定义store中,添加配置项(第三个参数),用于持久化配置
    2. defineStore('',()=>{
    3. ...
    4. },{
    5. // 持久化配置,存入ls
    6. persist:{
    7. enabled: true
    8. }
    9. })

    3. 不同登录状态的模板适配(多模板适配)

    多模板适配 思路:登录时显示第一块,非登录时显示第二块

    判断条件:是否有token

    1. <template v-else>
    2. ...
    3. template>

    4. 请求拦截器携带token

    token作为用户标识,多个接口要正确携带token才能正确显示数据 -> 在接口调用时携带token -> 采用拦截器携带(便于 统一控制)

    解决: 请求拦截器可以在接口发起前 对请求参数进行操作。通常token被注入到请求header中,格式按照后端要求的格式进行拼接

    1. // utils/http.js中
    2. // axios请求拦截器
    3. httpInstance.interceptors.request.use(config => {
    4. // 请求拦截器携带token(->按后端要求拼接token数据),使得多个接口携带token
    5. const userStore = useUserStore()
    6. const token = userStore.userInfo.token
    7. if(token){
    8. config.headers.Authorization = `Bearer ${token}` //按后端的要求拼接
    9. }
    10. return config
    11. },e => Promise.reject(e))

    5. 退出登录实现

    点击退出登录时,防止误触,弹出一个气泡确认框(el-popconfirm)进行二次确认。

    退出登录业务逻辑: 清除用户数据;跳转到登录页

    1. // 组件中,views/XXX.vue
    2. "confirm" title="确认退出吗?" confirm-button-text="确认" cancel-button-text="取消">
    3. <template #reference>
    4. <a href="javascript:;">退出登录a>
    5. template>
    1. // store中(stores/XXX.js),定义清除用户信息的action
    2. const clearUserInfo = ()=>{
    3. userInfo.value = {}
    4. }
    5. return {
    6. clearUserInfo
    7. }
    8. ...
    9. // 组件中(views/XXX.vue),实现退出登录业务的逻辑
    10. import { useRouter } from 'vue-router'
    11. const router = useRouter()
    12. const confirm = ()=>{
    13. userStore.clearUserInfo() // 1. 清除用户数据( -> 调用action进行操作)
    14. router.push('/login') // 2. 转到登录页
    15. }

    6. token失效(401拦截)

    token有效性保持一段时间,如果用户不做任何操作,token会失效,使用失效的token去请求一些接口,接口就会报401状态码错误

     解决:在axios响应拦截器做统一处理

    1. // 401拦截
    2. import router from '@/router' //js中的路由对象!!
    3. // axios响应式拦截器中
    4. httpInstance.interceptors.response.use(res => res.data, e => {
    5. const userStore = useUserStore()
    6. ...
    7. // 401失效处理: 1.清除用户数据 2. 跳转
    8. if(e.response.status === 401){
    9. userStore.clearUserInfo()
    10. router.push('/login')
    11. }
    12. return Promise.reject(e)
    13. })
    14. export default httpInstance

    参考:Popconfirm 气泡确认框 | Element Plus

    ElementUI 教程 - Popconfirm 气泡确认框

    一文教你搞定所有前端鉴权与后端鉴权方案,让你不再迷惘 - 掘金 (juejin.cn)

  • 相关阅读:
    JAVA上门家政服务系统源码微信小程序+微信公众号+APP+H5
    HTTPS 之fiddler抓包--jmeter请求
    Rust——关于Option详解
    简述React 和 Vue 的 diff 时间复杂度从 O(n^3) 优化 到 O(n) ,那么 O(n^3) 和 O(n) 是如何计算出来的 ?
    电视电话会议和视频会议的区别
    Springboot整合规则引擎
    MySQL主从同步
    redis常识
    Python画爱心——一颗会跳动的爱心~
    java毕业设计成品基于SpringBoot体育用品购物商城-协同过滤推荐算法[包运行成功]
  • 原文地址:https://blog.csdn.net/weixin_42479421/article/details/132921115