前端保存Token

350 阅读2分钟

1. Token是什么?

Token,即令牌,是由服务器产生的一串加密字符串,作为客户端进行请求的“令牌”。当用户第一次登录成功后,服务器生成一个Token并返回给客户端,客户端往后发送请求时只需要携带Token。

2. LocalStorage保存Token

(1)LocalStorage介绍

Web 存储是 HTML5 的重要功能之一,它允许 Web 应用程序在用户浏览器中本地存储数据。

LocalStorage 是浏览器提供的一种 Web 存储形式,它允许 Web 应用程序将数据以字符串的形式存储在用户的浏览器中,并且没有失效时间(永久保存,除非主动删除),即使关闭浏览器或浏览器的页面,存储的数据依旧有效。 需要注意,换个浏览器或者换个设备则无法访问存储在 LocalStorage 的数据。

方法描述
setItem(key, value)将数据以字符串形式保存在 LocalStorage 中,其中 key 为键(用于查找 value ),value即是要被保存的数据字符串
getItem(key)通过 key 访问 LocalStorage 保存的 value
removeItem(key)通过 key 删除 LocalStorage 的数据,删除对应的键值对

(2)封装LocalStorage保存、删除Token方法

将保存和删除token的方法单独封装在一个JS文件里,方便复用。以下为文件内容:

// storage.js

//这里以 “token” 字符串为键,
const TOKEN_NAME = "token";

// 保存 token 到 localStorage 中,这里的参数token是字符串,可以直接保存
/* 如果token是个对象或者数组,则需要调用 JSON.stringfy(obj) 方法,把对象或数组转化为字符串,再存储到 LocalStorage 中 */
export const setToken = (token) => {
  localStorage.setItem(TOKEN_NAME, token);
};

// 从 localStorage 中获取 token
// 同样,如果需要对象或者数组,则调用JSON.parse(localStorage.getItem(TOKEN_NAME))
export const getToken = () => {
  return localStorage.getItem(TOKEN_NAME);
};
// 删除 token
export const delToken = () => {
  localStorage.removeItem(TOKEN_NAME);
};

3. Axios设置请求拦截器,为请求头添加Token

创建一个 axios 实例,按照需求配置相关参数并暴露出去,方便其他文件导入。

// 对axios进行二次封装,且设置请求、响应拦截器
import { getToken } from "storage";
import axios from "axios";
export const Axios = axios.create({
  baseURL: "https://www.baidu.com",
  timeout: 5000,
});
// 添加请求拦截器
Axios.interceptors.request.use(
  (config) => {
    const token = getToken();
    if (token) {
      config.headers["token"] = getToken();
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

4. 将获取到的Token先保存到 Vuex 中,再保存到 LocalStorage 里

这里是Vuex v4版本。

import { createStore } from "vuex";
import { createApp } from "vue";
import { setToken, getToken } from "@/storage";
// 创建 store 实例
export const store = createStore({
  state() {
    return {
      token: getToken() || '',
    };
  },
  mutations: {
    // 保存 token 到 Vuex 中
    setToken(state, payload) {
       // 保存 token 到 LocalStorage 里
      setToken(payload);
      state.token = payload;
    },
    },
  },
});

const app = createApp({ /* 根组件 */});
// 将 store 实例作为插件安装
app.use(store);