最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue項(xiàng)目中存儲(chǔ)與使用后端傳遞過(guò)來(lái)的token

 更新時(shí)間:2023年03月17日 11:37:41   作者:梔椩  
vue作為一個(gè)單頁(yè)面應(yīng)用,vuex作為它的狀態(tài)管理工具,它至少是可以很好的保存這個(gè)token值,下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目中存儲(chǔ)與使用后端傳遞過(guò)來(lái)的token的相關(guān)資料,需要的朋友可以參考下

前言

以前一直都是在postman中測(cè)試驗(yàn)證token,現(xiàn)在用在真正的項(xiàng)目中,記錄一下在vue項(xiàng)目中token的存儲(chǔ)和使用

后端關(guān)于token的設(shè)置

app.js中需要設(shè)置token的地方

const expressJWT = require('express-jwt')
const app = express();
const config = require('./config')
app.use(expressJWT({secret: config.jwtSecretKey}).unless({path: [/^\/api\/users/]}))

const testRouter = require('./routes/testToken')
app.use('/my', testRouter)

config中就是一個(gè)秘鑰,我單獨(dú)寫(xiě)了一個(gè)文件,不再放上來(lái)了

unless后面是不需要token的地址,也就是以/api/users開(kāi)頭的鏈接都不需要token驗(yàn)證

用到的testToken.js如下:

const express = require('express');
const router = express.Router();

const test = require('../router_handler/testToken')

router.get('/current', test.test)

module.exports = router

使用模塊化的寫(xiě)法,真正的路由處理函數(shù)寫(xiě)在/router_handler/testToken.js中,內(nèi)容如下:

const db = require('../db/index');

exports.test = (req, res) => {
    const sql = 'select * from users where id = ?'
    db.query(sql, req.user.id, (err, results) => {
        if(err) return res.send({status: 404, message: err})
        if(results.length !== 1) return res.send({status: 404, messsage: '獲取用戶信息失敗,需重新登錄'})
        res.json(results[0])
    })
    // res.send(req)
}

實(shí)際上就是一個(gè)獲取用戶信息的處理函數(shù),在mysql中根據(jù)id查詢用戶信息

注意,重點(diǎn)來(lái)了,經(jīng)過(guò)上述一系列設(shè)置后,當(dāng)我們?cè)L問(wèn)非/api/users開(kāi)頭的鏈接的時(shí)候,都需要驗(yàn)證,也就是在請(qǐng)求參數(shù)中提供token,而這個(gè)token則是在登錄的時(shí)候給出的,我寫(xiě)在用戶登錄的處理函數(shù)中user.js,如下

// 用戶登錄的處理函數(shù)
exports.login = (req, res) => {
    const userinfo = req.body
    const sql = 'select * from users where name = ?'
    db.query(sql, userinfo.name, (err, results) => {
        if(err) return res.send({status: 404, message: err.message})
        if(results.length !== 1) return res.status(404).json('用戶不存在!')
        const compareResults = bcrypt.compareSync(userinfo.password, results[0].password)
        if(!compareResults) return res.status(404).json('密碼錯(cuò)誤!')
        const user = {
            id: results[0].id,
            name: results[0].name,
            avatar: results[0].avatar,
            identify: results[0].identify
        }
        const tokenStr = jwt.sign(user, config.jwtSecretKey, {expiresIn: '10h'})
        res.json({
            status:200, 
            message: '登錄成功', 
            // result: results[0], 
            token: 'Bearer ' + tokenStr
        })
    })
}

不相關(guān)的代碼我就不寫(xiě)了,注意看到tokenStr這個(gè)變量,就是存儲(chǔ)的token值,通過(guò)res響應(yīng)出來(lái)。

總結(jié)一下,后端存儲(chǔ)token的流程:

  • 編寫(xiě)登錄函數(shù),向頁(yè)面響應(yīng)token字符串;
  • 入口文件中(app.js)設(shè)置需要提供token的路由,并提供解析token字符串的秘鑰;
  • 編寫(xiě)對(duì)應(yīng)的路由函數(shù),處理請(qǐng)求

至此,后端的關(guān)鍵要點(diǎn)已經(jīng)寫(xiě)完了,進(jìn)入前端token的存儲(chǔ)

前端頁(yè)面取用token

前端頁(yè)面在登錄的時(shí)候,應(yīng)該把后端響應(yīng)過(guò)來(lái)的token存儲(chǔ)起來(lái),這樣就可以實(shí)現(xiàn)路由守護(hù)和免登陸的功能

token存儲(chǔ)

通過(guò)ajax請(qǐng)求路由地址,并訪問(wèn)res.data中的token字符串,并存儲(chǔ)在瀏覽器中,步驟和寫(xiě)法是固定的

我寫(xiě)在Login.vue中,如下:

methods: {
    submitForm(formName) {
      this.$refs[formName].validate(valid => {
        if (valid) {
          this.$axios
            .post("/users/login", this.loginUser)
            .then(res => {
                // console.log(res)
                //token
                const { token } = res.data
                localStorage.setItem("eleToken", token)
             
                this.$router.push("/index");
            });
        } else {
          console.log("error submit!!");
          return false;
        }
      });
    }
  }

const { token } = res.data通過(guò)解構(gòu)賦值的方式取出響應(yīng)數(shù)據(jù)中的token

localStorage.setItem("eleToken", token)將token存儲(chǔ)在瀏覽器本地

前端使用token實(shí)現(xiàn)路由守衛(wèi)

其實(shí)在后端代碼中寫(xiě)的unless就是路由守衛(wèi)的意思,不過(guò)前端應(yīng)該也要有這個(gè),不然不用登錄就可以訪問(wèn)到網(wǎng)站的內(nèi)容了,這顯然不合理

看看前端怎么寫(xiě)的,寫(xiě)在router.js中

import Vue from 'vue'
import VueRouter from 'vue-router'
import Index from './views/Index.vue'
import Register from './views/Register.vue'
import NotFound from './views/404.vue'
import Login from './views/Login.vue'

Vue.use(VueRouter)

const router = new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes: [
        { path: '*', name: '/404', component: NotFound },
        { path: '/', redirect: '/index' },
        { path: '/register', name: 'register', component: Register },
        { path: '/index', name: 'index', component: Index },
        { path: '/login', name: 'login', component: Login },
    ]
})

// 路由守衛(wèi)
router.beforeEach((to, from, next) => {
    const isLogin = localStorage.eleToken ? true: false
    if(to.path == '/login' || to.path == '/register'){
        next()
    }else {
        isLogin ? next() : next('/login')
    }
})

export default router

看路由守衛(wèi)后面的代碼就可以了

使用的是router中的beforeEach函數(shù)

使用的邏輯如下:

  1. 定義一個(gè)isLogin(布爾值),如果瀏覽器中l(wèi)ocalStorage中存有eleToken對(duì)象,則值為true,否則為false
  2. 確定哪些路由不需要攔截:to.path == '/login' || to.path == '/register'也就是登錄和注冊(cè)不需要攔截,直接放行,用next()
  3. 對(duì)于攔截的路由,判斷isLogin是否為true,是就說(shuō)明已經(jīng)登錄過(guò)了,有token,直接放行,如果為false,就跳轉(zhuǎn)到登錄的路由。

請(qǐng)求攔截和響應(yīng)攔截

還有一點(diǎn)沒(méi)有搞定,需要判斷當(dāng)前的token是不是過(guò)期了的,因?yàn)楹蠖藢?xiě)token的時(shí)候是給了個(gè)10小時(shí)的有效期,過(guò)期后,應(yīng)該重新登錄才對(duì)

這里我寫(xiě)在一個(gè)單獨(dú)的http.js文件中,先上代碼

import axios from "axios";
import { Message, Loading } from 'element-ui';
import router from "./router"

let loading;
function startLoading(){
    loading = Loading.service({
        lock: true,
        text: '數(shù)據(jù)加載中',
        background: 'rgba(0,0,0,0.7)'
    })
}

function endLoading(){
    loading.close();
}

// 請(qǐng)求攔截
axios.interceptors.request.use(config => {
    startLoading();
    if(localStorage.eleToken){
        // 設(shè)置統(tǒng)一的請(qǐng)求頭
        config.headers.Authorization = localStorage.eleToken
    }
    return config
}, error => {
    return Promise.reject(error)
})

//響應(yīng)攔截
axios.interceptors.response.use(response => {
    endLoading();
    return response
}, error => {
    // 錯(cuò)誤提醒
    endLoading();
    Message.error(error.response.data)

    // 獲取錯(cuò)誤狀態(tài)碼
    const {status} = error.response
    if(status == 401){
        Message.error("token失效,請(qǐng)重新登錄")
        localStorage.removeItem('eleToken')
        router.push('/login')
    }
    return Promise.reject(error)
})

export default axios

看后面的請(qǐng)求攔截和響應(yīng)攔截就可以了

分兩步:

請(qǐng)求攔截,當(dāng)請(qǐng)求數(shù)據(jù)的時(shí)候,判斷l(xiāng)ocalStorage中是否存儲(chǔ)了eleToken,有的話,就把它寫(xiě)到請(qǐng)求頭中去響應(yīng)攔截,當(dāng)token過(guò)期后,頁(yè)面會(huì)響應(yīng)一個(gè)401的錯(cuò)誤狀態(tài)碼,這里要做的事情就是要把這個(gè)過(guò)期的token清除,并跳轉(zhuǎn)到登錄頁(yè)面

注意,這里坑的一筆,坑了博主一個(gè)下午,我寫(xiě)的

頁(yè)面會(huì)響應(yīng)一個(gè)401的錯(cuò)誤狀態(tài)碼

對(duì)嗎,但是經(jīng)過(guò)測(cè)試,token過(guò)期后根本就沒(méi)有跳轉(zhuǎn)到登錄頁(yè)面啊,后來(lái)我打印了一下這個(gè)status,發(fā)現(xiàn)這個(gè)值等于0啊,坑爹呢不是嗎,所以響應(yīng)攔截這里正確的寫(xiě)法應(yīng)該是:

//響應(yīng)攔截
axios.interceptors.response.use(response => {
    endLoading();
    return response
}, error => {
    // 錯(cuò)誤提醒
    endLoading();
    Message.error(error.response.data)
    console.log(error.response)

    // 獲取錯(cuò)誤狀態(tài)碼
    const {status} = error.response
    console.log(status)
    if(status === 0){
        Message.error("token失效,請(qǐng)重新登錄")
        localStorage.removeItem('eleToken')
        // console.log(error)
        router.push('/login')
    }
    return Promise.reject(error)
})

把狀態(tài)碼改過(guò)來(lái)后就正常跳轉(zhuǎn)了。

至此,前后端token的使用都已經(jīng)順暢了~~

總結(jié)

到此這篇關(guān)于vue項(xiàng)目中存儲(chǔ)與使用后端傳遞過(guò)來(lái)的token的文章就介紹到這了,更多相關(guān)vue存儲(chǔ)使用后端傳遞的token內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決vue打包 npm run build-test突然不動(dòng)了的問(wèn)題

    解決vue打包 npm run build-test突然不動(dòng)了的問(wèn)題

    這篇文章主要介紹了解決vue打包 npm run build-test突然不動(dòng)了的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Vue進(jìn)行數(shù)據(jù)可視化圖表展示的實(shí)現(xiàn)示例

    Vue進(jìn)行數(shù)據(jù)可視化圖表展示的實(shí)現(xiàn)示例

    數(shù)據(jù)可視化是現(xiàn)代化的數(shù)據(jù)分析和展示方式,可以使數(shù)據(jù)更加直觀、易于理解和傳達(dá),Vue作為一款流行的前端框架,提供了豐富的插件和工具來(lái)實(shí)現(xiàn)數(shù)據(jù)可視化圖表展示,本文將介紹如何使用Vue和Echarts/D3.js來(lái)實(shí)現(xiàn)數(shù)據(jù)可視化圖表展示,并提供示例代碼和實(shí)際應(yīng)用場(chǎng)景
    2023-10-10
  • Vue?Vuex搭建vuex環(huán)境及vuex求和案例分享

    Vue?Vuex搭建vuex環(huán)境及vuex求和案例分享

    這篇文章主要介紹了Vue?Vuex搭建vuex環(huán)境及vuex求和案例分享,?Vue?中實(shí)現(xiàn)集中式狀態(tài)管理的一個(gè)?Vue?插件,對(duì)?vue?應(yīng)用中多個(gè)組件的共享狀態(tài)進(jìn)行集中式的管理,下文相關(guān)介紹,需要的朋友可以參考一下
    2022-04-04
  • Vue3中v-for的使用示例詳解

    Vue3中v-for的使用示例詳解

    本文主要介紹了Vue3中v-for的使用方法,包括遍歷數(shù)組、遍歷對(duì)象、索引訪問(wèn)、嵌套遍歷以及結(jié)合計(jì)算屬性和方法的使用,v-for可以幫助用戶動(dòng)態(tài)地生成和管理列表數(shù)據(jù),并根據(jù)需要進(jìn)行復(fù)雜的DOM操作,提供了多種示例,幫助讀者更好地理解和使用v-for
    2024-10-10
  • vue中的非父子間的通訊問(wèn)題簡(jiǎn)單的實(shí)例代碼

    vue中的非父子間的通訊問(wèn)題簡(jiǎn)單的實(shí)例代碼

    這篇文章主要介紹了vue中的非父子間的通訊問(wèn)題簡(jiǎn)單的實(shí)例代碼,需要的朋友可以參考下
    2017-07-07
  • vue-router的hooks用法詳解

    vue-router的hooks用法詳解

    這篇文章主要介紹了vue-router的hooks用法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • vue-cli構(gòu)建項(xiàng)目下使用微信分享功能

    vue-cli構(gòu)建項(xiàng)目下使用微信分享功能

    這篇文章主要介紹了vue-cli構(gòu)建項(xiàng)目下使用微信分享功能,本文通過(guò)實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • vxe-table如何在單元格中渲染簡(jiǎn)單的餅圖

    vxe-table如何在單元格中渲染簡(jiǎn)單的餅圖

    這篇文章主要介紹了vxe-table如何在單元格中渲染簡(jiǎn)單的餅圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • element-ui自定義表格如何給input雙向綁定數(shù)據(jù)

    element-ui自定義表格如何給input雙向綁定數(shù)據(jù)

    這篇文章主要介紹了element-ui自定義表格如何給input雙向綁定數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue項(xiàng)目中的組件傳值方式

    vue項(xiàng)目中的組件傳值方式

    這篇文章主要介紹了vue項(xiàng)目中的組件傳值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

九台市| 东光县| 当阳市| 潼关县| 滦南县| 望谟县| 大田县| 西峡县| 新建县| 呼和浩特市| 古蔺县| 河南省| 鄂托克旗| 武冈市| 勃利县| 阿克苏市| 南和县| 合江县| 哈密市| 麻城市| 辛集市| 驻马店市| 成都市| 卢龙县| 江山市| 贵阳市| 建湖县| 耒阳市| 从江县| 翁源县| 乌审旗| 平谷区| 沽源县| 绥化市| 乐平市| 盱眙县| 昌图县| 平湖市| 灌南县| 南投县| 通州区|