token是一个用户自定义的任意字符串,目前开发中,token都是在服务端生成而且token的值会保存到服务器后台。只有服务器和客户端知道这个字符串,因而,这个token就成了二者之间的秘钥,它可让服务器确认请求是来自客户端仍是恶意的第三方。vue
Axios 是一个基于 promise 的 HTTP 库,能够用在浏览器和 node.js 中。node
官方网址:www.axios.com/ios
中文文档:www.kancloud.cn/yunye/axios…git
在简单介绍完这些基础知识以及用到的插件以后,咱们便要开始今天的主题--token验证。github
首先在vue.js 中下载axios,npm install axios
,在main.js
文件中全局使用:数据库
import axios from 'axios';
Vue.prototype.$http = axios;
复制代码
这样引入以后,在其余的文件中即可以使用$http
来调用接口:npm
getRoomDetail() {
this.$http.get(this.roomDetailApi).then(
res => {
this.roomDetail = res.data.data;
},
err => {
console.log("接受数据错误" + err);
}
).catch(err => {
console.log("服务器错误" + err);
})
}
复制代码
以上步骤只是简单的实现了先后台的交互(在前台调用后台接口来获取数据),接下来咱们便要进一步学习,实现token的验证。axios
根据上面的介绍,咱们在成功登陆后台并拿到返回给的token以后,须要使用localStorage全局存储,实现代码以下:api
// 用户登陆
login() {
this.postData = {
account: this.userInfo.account,
password: this.$md5(this.userInfo.password),
};
this.$http.post(configIp.apiConfig.user.login, this.postData)
.then(res => {
if (res.data.errno === 0) {
this.$Message.success('登录成功');
this.$router.push('roomInfo');
//全局存储token
window.localStorage["token"] = JSON.stringify(res.data.data.token);
} else {
this.$Message.error('登陆失败');
this.forgetPassword = true;
}
}).catch(err => {
console.log("登陆失败");
})
},
复制代码
接下来,咱们要作的就是设置请求头,在以后的接口请求过程当中,都要经过token的认证来获取数据,添加 http.js
文件(拦截器)promise
import axios from 'axios';
import router from './router';
// axios 配置
axios.defaults.timeout = 8000;
axios.defaults.baseURL = 'https://api.github.com';
// http request 拦截器
axios.interceptors.request.use(
config => {
if (localStorage.token) { //判断token是否存在
config.headers.Authorization = localStorage.token; //将token设置成请求头
}
return config;
},
err => {
return Promise.reject(err);
}
);
// http response 拦截器
axios.interceptors.response.use(
response => {
if (response.data.errno === 999) {
router.replace('/');
console.log("token过时");
}
return response;
},
error => {
return Promise.reject(error);
}
);
export default axios;
复制代码
添加拦截器以后,修改 main.js
文件: 将上面
import axios from 'axios';
Vue.prototype.$http = axios;
复制代码
改成:
import http from './http'; //此处问http文件的路径
Vue.prototype.$http = http;
复制代码
完成该步骤以后,基本的操做已经实现了,下面让咱们查看一下是否已经添加请求头:
以上操做实现了添加请求头token,在以后的请求中,会自动添加该请求头,可是不是每个页面都须要登陆权限(后台会实现不须要进行token验证的筛选),那么前台也须要经过路由的meta标签对须要作校验的路由页面进行标记,其余页面则不须要验证,代码以下:
{
path: '/userInfo',
name: 'userInfo',
meta: {
requireAuth: true, // 该路由项须要权限校验
}
component: userInfo
}, {
path: '/userList',
name: 'userList', // 该路由项不须要权限校验
component: userInfo
}
复制代码
以后,咱们能够定义一个路由防卫,每次路由跳转,咱们都来作一下权限校验,参考代码以下:
router.beforeEach((to, from, next) => {
if (to.meta.requireAuth) { // 判断该路由是否须要登陆权限
if (localStorage.token) { // 获取当前的token是否存在
console.log("token存在");
next();
} else {
console.log("token不存在");
next({
path: '/login', // 将跳转的路由path做为参数,登陆成功后跳转到该路由
query: {redirect: to.fullPath}
})
}
}
else { // 若是不须要权限校验,直接进入路由界面
next();
}
});
复制代码
到此,用vue.js实现前台添加请求头,经过axios设置拦截器添加token就已经实现了。
若是对node.js实现生成token,处理token等操做感兴趣,但愿关注下一篇文章~~~~~