ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

集成VUEX+sessionStorage保存登入信息

2021-12-01 20:31:05  阅读:183  来源: 互联网

标签:const sessionStorage data token user 登入 VUEX response store


登录信息保存原理

  • 后端保存用户信息 集成redis 登入成功后,生成token,以token为key,以用户信息为value,放入redis中

  • 前端显示登入用户 header显示登录昵称 集成VUEX+sessionStorage保存登入信息
    在每个请求中加入当前user的token进行检验

如果只用vuex的话页面刷新会导致user信息失效
所以加入sessionStorage.js来保存信息,保存到客户端,防止信息丢失

image-20211108224152185
index.html中引入sessionStorage.js

<script src="<%= BASE_URL %>js/session-storage.js"></script>

在store中配置状态vuex

import { createStore } from 'vuex'

declare let SessionStorage: any;
const USER = "USER";

const store = createStore({
    state: {
        user: SessionStorage.get(USER) || {}
    },
    mutations: {//对应 store.commit("setUser", data.content);这个方法
        setUser (state, user) {
            console.log("store user:", user);
            state.user = user;
            SessionStorage.set(USER, user);
        }
    },
    actions: {
    },
    modules: {
    }
});

界面中store的使用

import { defineComponent, ref, computed } from 'vue';
    import axios from 'axios';
    import { message } from 'ant-design-vue';
    import store from "@/store";     

// 登录后保存
            const user = computed(() => store.state.user);//自动计算形式要引入组件

登入功能

// 登录
const login = () => {
    console.log("开始登录");
    loginModalLoading.value = true;
    loginUser.value.password = hexMd5(loginUser.value.password + KEY);
    axios.post('/user/login', loginUser.value).then((response) => {
        loginModalLoading.value = false;
        const data = response.data;
        if (data.success) {
            loginModalVisible.value = false;
            message.success("登录成功!");

            store.commit("setUser", data.content);//加入到vuex中保存状态
        } else {
            message.error(data.message);
        }
    });
};


// 退出登录
            const logout = () => {
                console.log("退出登录开始");
                axios.get('/user/logout/' + user.value.token).then((response) => {
                    const data = response.data;
                    if (data.success) {
                        message.success("退出登录成功!");
                        store.commit("setUser", {});//设空
                    } else {
                        message.error(data.message);
                    }
                });
            };

配置前端拦截器,添加Token

/**
 * axios拦截器
 */
axios.interceptors.request.use(function (config) {
    console.log('请求参数:', config);
    const token = store.state.user.token;
    if (Tool.isNotEmpty(token)) {
        config.headers.token = token;
        console.log("请求headers增加token:", token);
    }
    return config;
}, error => {
    return Promise.reject(error);
});
axios.interceptors.response.use(function (response) {
    console.log('返回结果:', response);
    return response;
}, error => {
    console.log('返回错误:', error);
    const response = error.response;
    // const status = response.status;
    // if (status === 401) {
    //     // 判断状态码是401 跳转到首页或登录页
    //     console.log("未登录,跳到首页");
    //     store.commit("setUser", {});
    //     message.error("未登录或登录超时");
    //     router.push('/');
    // }
    return Promise.reject(error);
});

标签:const,sessionStorage,data,token,user,登入,VUEX,response,store
来源: https://blog.csdn.net/birenyin/article/details/121663742

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有