基于vue/cli3.0+脚手架搭建Vue项目(11)
文章目录
前言
在vue项目里,token是用来当作前端和服务器通信的标识。经过登录页面后,每次发起的请求都需要携带上它,给服务器进行认证。
一、vue项目里token的实现步骤
到第四步这里可以有两种实现:
二、代码实现
1.登录页面
( login接口可以看这里https://blog.csdn.net/weixin_43697548/article/details/124355482?spm=1001.2014.3001.5502)
<template>
<div class="loginPage">
<div class="content">
<div class="title">
<span>账号登录</span>
</div>
<div class="input-group">
<div class="input-row">
<el-input v-model="username" placeholder="请输入账号/手机号"></el-input>
</div>
<div class="input-row">
<el-input show-password v-model="password" placeholder="请输入密码"></el-input>
</div>
</div>
<div class="btn-row">
<el-button size="medium" round @click="login">登录</el-button>
</div>
<div class="register">注册账号</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
username: '',
password: '',
};
},
methods: {
login() {
if (!this.username || !this.password) {
return;
}
let params = {
username: this.username,
password: this.password,
remember: false,
};
this.$api.common.login(params).then(res => {
let { data, headers } = res;
if (data.status === 200) {
// 其他信息...
// 因为接口返回的headers里已经设置了cookie
if (headers.cookie) {
headers.cookie.split(',').forEach(item => {
let tempVal = item.split('=');
if (tempVal[0] == 'token') {
this.cacheCookie('TOKEN', tempVal[1]);
}
if (tempVal[0] == 'uuid') {
this.cacheCookie('UUID', tempVal[1]);
}
});
this.$router.push('/index');
}
}
});
},
cacheCookie(type, value) {
localStorage.setItem(type, value);
this.$store.commit('OP_' + type, value);
},
},
};
</script>
<style lang="scss" scoped>
.loginPage {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
.content {
display: flex;
flex-direction: column;
width: 280px;
height: 200px;
.title {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 12px;
}
.input-group {
flex: 1;
display: flex;
flex-direction: column;
.input-row {
margin-bottom: 12px;
}
}
.btn-row {
flex: 1;
display: flex;
justify-content: space-between;
/deep/ .el-button {
width: 100%;
}
}
.register {
margin-top: 4px;
text-align: right;
}
}
}
</style>
2.api请求拦截时添加token信息
// 请求拦截
HTTP.interceptors.request.use(
config => {
//设置请求头信息
let token = localStorage.getItem('token') || '';
let uuid = localStorage.getItem('uuid') || '';
const headersOption = {
token,
uuid,
};
config.headers = Object.assign(config.headers, headersOption);
return config;
},
err => {
console.log(err);
},
);
后台在之后的每个接口的过滤器里都会去校验token
信息,所以前端可以不需要再校验是否存在或者过期。但是,我们需要在刷新页面时,重新更新store
里的token
3.router里更新token和uuid
import store from '@/store/index';
router.beforeEach((to, from, next) => {
cacheCookie();
next();
});
function cacheCookie() {
// 将localStorage里的token信息缓存在vuex
store.commit('OP_TOKEN', localStorage.getItem('TOKEN'));
store.commit('OP_UUID', localStorage.getItem('UUID'));
}
tip:附上store
代码:
import { OP_TOKEN , OP_UUID } from './mutations-type';
const state = {
token: '',
uuid: ''
};
const getters = {
getToken: state => state.token,
getUuid: state => state.uuid
};
const mutations = {
[OP_TOKEN](state, data) {
state.token =data
},
[OP_UUID](state, data) {
state.uuid =data
}
};
const action = {};
export default {
public: {
state,
getters,
mutations,
action
}
};
mutations-type.js
文件代码
export const OP_TOKEN = 'OP_TOKEN';
export const OP_UUID = 'OP_UUID';
总结
祝你今天愉快