在vue中如何获取token,并将token写进header
  zsamATBtEAEu 2023年11月02日 82 0


跨域问题这里就不多说了,直接进入今天正题:

login.vue

export default {
name: 'login',
data() {
return {
phone: '',
password: '',
device_type: '',
// registration_id: '', //极光推送 用户设备唯一标识 注册ID
token: '',
}
},
mounted() {
},
methods:{
goBack() {
this.$router.replace('/personage')
},
sub() {
let _this = this
if (_this.type == 1) {
if (_this.phone == '') {
alert('手机号不能为空')
return false
}
if (!(/^1[3|4|5|6|7|8|9]\d{9}$/.test(_this.phone))) {
alert('手机号码格式不正确');
return false;
}
if (_this.password == '') {
alert('密码不能为空')
return false
}
if (_this.password < 6 || _this.password > 20) {
alert('账号或密码错误')
return false
}
}else{
_this.$axios({
method: 'post',
url: _this.HICK + '/app/reg/login',
data: {
phone: _this.phone,
password: _this.password,
device_type: '未知设备',
},
})
.then(res => {
// console.log(res.data)
_this.token = res.data.data
console.log(_this.token)//获取到的token
// this.$store.commit('set_token', _this.token)
this.$store.commit('set_token', _this.token)
if (store.state.token) {
alert('登录成功')
this.$router.push('/')
console.log(store.state.token)
} else {
this.$router.replace('/login');
}

})
.catch(error => {
alert('账号或密码错误')
console.log(error)
})
}
}
}

}

接下来我们在src下创建store/index.js

import Vue from 'vue'
import Vuex from 'vuex'


Vue.use(Vuex)

export default new Vuex.Store({
state:{
token:''
},
mutations:{
set_token(state, token) {
state.token = token
sessionStorage.token = token
},
del_token(state) {
state.token = ''
sessionStorage.removeItem('token')
}
}
});

main.js

import Vue from 'vue'
import App from './App'
import router from './router'
import axios from 'axios'
import store from './store/index.js'


//axios赋值给变量http 将axios挂到vue原型上
Vue.prototype.$axios = axios
// 进行api映射
Vue.prototype.HOST = '/api'
Vue.prototype.HICK = '/app'


Vue.config.productionTip = false

//定义全局默认配置
axios.defaults.headers.common['Authentication'] = store.state.token;



/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
});





// 添加请求拦截器
axios.interceptors.request.use(config => {
// 在发送请求之前做些什么
//判断是否存在token,如果存在将每个页面header都添加token
if(store.state.token){
config.headers.common['Authentication']=store.state.token
}

return config;
}, error => {
// 对请求错误做些什么
return Promise.reject(error);
});

// http response 拦截器
axios.interceptors.response.use(
response => {

return response;
},
error => {

if (error.response) {
switch (error.response.status) {
case 401:
this.$store.commit('del_token');
router.replace({
path: '/login',
query: {redirect: router.currentRoute.fullPath}//登录成功后跳入浏览的当前页面
})
}
}
return Promise.reject(error.response.data)
});

router/index.js

import Vue from 'vue'
import Router from 'vue-router'
import store from '@/store/index.js'


Vue.use(Router)

// 页面刷新时,重新赋值token
if (sessionStorage.getItem('token')) {
store.commit('set_token', sessionStorage.getItem('token'))
}

const router = new Router({
mode: 'history',
routes: [
{
//个人中心
path: '/personage',
name: '个人中心',
component: () => import('@/views/Personage')
},
{
//登录
path: '/login',
name: 'login',
component: () => import('@/views//member/login'),
meta: {
show: true,
}
}
]
});

//导航守卫
// 使用router.beforeEach注册一个全局前置守卫,判断用户是否登录
router.beforeEach((to, from, next) => {
if (to.matched.some(r => r.meta.requireAuth)) { //这里的requireAuth为路由中定义的 meta:{requireAuth:true},意思为:该路由添加该字段,表示进入该路由需要登陆的
if (store.state.token) {
next();
} else {
next({
path: '/login',
query: {redirect: to.fullPath}
})
}
} else {
next();
}
})

export default router

以上就配置完了?最后附带一个自己的使用吧

export default{
name: 'Personage',
data () {
return {
token: '',
}
},
mounted() {
this.$axios.post(this.HICK + '', {
token: window.sessionStorage.getItem("token")
})
.then(res => {
console.log(res.data)
})
.catch(error => {
console.log(error);
})
},

共同学习,希望能一起讨论

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论