<template> <div> <p><router-link :to="{name:'index'}">主頁</router-link></p> <p><router-link :to="{name:'login'}">登陸</router-link></p> <p><router-link :to="{name:'logout'}">註銷</router-link></p> <p><router-link :to="{name:'me'}">我的信息</router-link></p> <p>登陸狀態:{{this.$store.state.me.login}}</p> </div> </template> 複製代碼
import Vue from 'vue' import router from '../router'; export default{ namespaced:true, state:{ login :false }, mutations:{ changeLogin(state,{result}){ state.login = result; } }, actions:{ async checkMe({commit}){ const result = await Vue.prototype.$http.get('/me').then(data=>data.data); if(!result){ router.push({name:'login'}) return } commit('changeLogin',{result}) } } } 複製代碼
//serve/app.js文件 express服務器 const express = require('express') //中間件--用於下發session const session = require('express-session') const app = express() //使用express-session下發session app.set('trust proxy', 1) app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true, })) 複製代碼
<template> <div> //請求後臺數據 <Button @click="getTest">敏感接口</Button> //請求信息展現 {{result}} //頁面跳轉組件 <route_list></route_list> </div> </template> <script> import route_list from '../components/route_list' export default { components:{ route_list }, data(){ return{ result:"" } }, methods:{ //請求敏感接口 async getTest(){ this.result = await this.$http.get("/").then(res=>res.data) } } } </script> 複製代碼
app.get('/', function (req, res) { if(req.session.login){ res.send("hello world") }else{ res.send(403) } }) 複製代碼
import axios from 'axios'; import url from 'url'; import router from '../src/router' //建立axios實例 var instance = axios.create({ baseURL: '/api' }); //攔截器 instance.interceptors.response.use( function(response){ return response; },function(error){ //敏感接口.若是沒有session跳轉登陸界面 if(error.response.status==403){ router.push({name:"login"}) } }) export default instance; 複製代碼
若是返回結果爲true,登陸狀態,就能夠進行訪問敏感接口了.前端
//路由守衛 router.beforeEach((to,from,next)=>{ if(to.name != 'login' && to.name != 'index'){ store.dispatch('me/checkMe') } next() }) 複製代碼
actions:{ async checkMe({commit}){ //請求/me接口,對登陸信息進行判斷,並保留狀態 const result = await Vue.prototype.$http.get('/me').then(data=>data.data); //返回值爲false,跳轉至login if(!result){ router.push({name:'login'}) return } commit('changeLogin',{result}) } } 複製代碼
//驗證是否登陸 app.get('/me', function (req, res) { //判斷session是否爲true if(req.session.login){ res.send(true) }else{ res.send(false) } }) 複製代碼
若是返回結果爲true,登陸狀態,就能夠進行頁面跳轉了.vue
<template> <div> <h1>登陸</h1> <Button @click="login">登陸</Button> <route_list></route_list> </div> </template> <script> import route_list from '../components/route_list' export default { components:{ route_list }, methods:{ async login(){ //請求登陸接口 const result = await this.$http.get("/login").then(data=>data.data); //記錄登陸狀態 this.$store.commit('me/changeLogin',{result}) } }, } </script> 複製代碼
//登陸接口,更改session狀態 app.get('/login', function (req, res) { req.session.login = true, res.send(true) }) 複製代碼
如今就是登陸狀態了node
<template> <div> <h1>註銷</h1> <Button @click="login">註銷</Button> <route_list></route_list> </div> </template> <script> import route_list from '../components/route_list' export default { components:{ route_list }, data(){ return{ } }, methods:{ async login(){ const result = await this.$http.get("/logout").then(data=>data.data); this.$store.commit('me/changeLogin',{result}) } }, } </script> 複製代碼
//登陸接口,更改session狀態 app.get('/login', function (req, res) { req.session.login = false, res.send(false) }) 複製代碼
如今就是註銷狀態了ios