您好,登錄后才能下訂單哦!
本篇內容介紹了“Vue項目中token驗證登錄的實現方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
我是做后端的,前端并不是很懂,看vue這個框架看了近兩個禮拜才有點入門的感覺,所以這篇文章寫的可能不怎么好,僅作記錄,有什么不對或不足的地方歡迎大神指出。
做一個登錄界面,我選擇的是用token進行驗證登錄,我用的前端框架是Vue.js 和 element-ui,如何在vue 中使用token進行驗證登錄
1、利用token進行驗證登錄,用戶進行登錄操作時,后臺會生成一個token返回給前端,由前端 將這個token放到請求頭中(這個是百度的,一般都是放在請求頭),并且此后調用接口都要把token放到請求的請求頭傳回給后臺。
2、用戶登錄后,前端需要把token保存下來,后面發送請求的時候在拿出來;
3、在發送每個請求時都要把token加到請求頭里,寫一個全局的攔截器
1、 在src文件夾(我的vue項目是用vue-cli 腳手架創建的)下創建一個store文件夾,在store中創建一個index.js
2、src/store/index.js
import Vue form 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { token: localStorage.getItem('token') ? localStorage.getItem('token') : '' }, mutotions: { setToken (state,token) { state.token =token; localStorage.setItem("token",token.token); }, delToken (state) { state.token = ''; localStorage.removeItem("token"); } } }) export default store;
說明:
(1)在寫src/store/index.js 里的內容之前,要在你的項目里安裝Vuex ,這里只提供npm的安裝方法,在項目根目錄處打開cmd 輸入下面的命令,后回車
npm install vuex --save
(2) 在這個store/store/index.js中 這段代碼token.token , 是因為在login.vue中調用這個放法傳進來的是一個對象(即使你覺的你傳進來的是一個字符串,不知道為什么會被放到object里去),傳進來的對象里有token這個屬性
localStorage.setItem("token",token.token);
3、src/main.js
// The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import App from './App' import router from './router' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import axios from 'axios' import promise from 'es6-promise' import store from './store/index' promise.polyfill() Vue.use(ElementUI) Vue.config.productionTip = false axios.defaults.baseURL= 'http://192.168.80.152:8088' axios.defaults.headers.post['Content-Type'] = "application/json" axios.defaults.withCredentials = true axios.defaults.headers.common['Authorization'] = store.state.token Vue.prototype.$axios = axios /* 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['Authorization']=store.state.token.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) });
說明
(1)這個是全部的代碼,不一定都和這個一樣,下面說說用token驗證,src/main.js中要配置那些東西
(2)
import store from './store/index'
上面的代碼是將之前寫的src/store/index.js導入到main.js中
new Vue({ el: '#app', router, store, components: { App }, template: '<App/>' });
上述代碼的store是將store掛載到Vue上,后面可以用this.$store 來獲取store
(3)
// 添加請求攔截器 axios.interceptors.request.use(config => { // 在發送請求之前做些什么 //判斷是否存在token,如果存在將每個頁面header都添加token if(store.state.token){ config.headers.common['Authorization']=store.state.token.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) });
上述代碼就是請求攔截器,將token放到請求的請求頭中
4、src/router/index.js
router.beforeEach((to, from, next) => { if(to.path === '/login') { next(); } else { let token = localStorage.getItem('token'); if(token === 'null' || token === '') { next('/login'); }else { next(); } } });
說明
(1)上述代碼是src/router/index.js 的配置 router 要暴露出來,代碼中有export default
**5、src/components/login/login.vue **
//在這個組件script標簽的export default上面引入一個東西 import { mapMutations } from 'vuex'; //這是methods部分 methods: { ...mapMutations(['setToken']), login(form){ let _this = this; if(form.phone === "" || form.password === ""){ _this.$message.error("請輸入手機號或密碼"); }else { this.$axios.post(`/user/check/login`,_this.form).then(res => { var code = res.data.code; var mes = res.data.message; if(code === 1){ /* storage.setItem("token",res.data.data); _this.token = res.data.data;*/ // _this.setToken({Authorization: _this.token}) // console.log("success"); _this.$message.success('登錄成功'); _this.token = res.data.data; _this.setToken({token: _this.token}); _this.$router.push({path:"/home"}); var storage = window.localStorage; //alert(storage.getItem("token")); if(this.$store.state.token) { this.$router.push('/home'); console.log(this.$store.state.token.token); } else { this.$router.replace('/login'); } }else{ _this.$message.error(mes); } }).catch(function(err){ console.log(err); _this.$message.error("登錄錯誤,請聯系程序開發人員!!"); }) } } }
說明
(1)
let _this = this;
上述代碼是將this放在_this這個變量中 ,函數有普通函數:function(){} 和箭頭函數
普通函數的this是指當前對象的引用,這里的當前對象是不確定的,箭頭函數的this是全局的一個this 代表的對象是不可變的,任何方式不可以改變他,具體的區別參見:箭頭函數和普通函數的區別
_this.setToken({token: _this.token});
上述代碼就是調用src/store/index.js中的setToken()方法,之所以可以用_this調用是因為之前在src/main.js中將store掛載在vue上了
...mapMutations(['setToken']),
“Vue項目中token驗證登錄的實現方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。