koa --- seesion實現登錄鑒權

koa + vue + session 實現一個簡單的登錄邏輯

  • /login component/login-session.html
<!DOCTYPE html><head><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head><body><div id="app"><div><input v-model="username" /><input v-model="password" /></div><div><button @click="login">Login</button><button @click="logout">Logout</button><button @click="getUser">GetUser</button></div><div><button @click="logs=[]">Clear Log</button></div><!-- 日志 --><ul><li v-for="(log, idx) in logs" :key="idx">{{log}}</li></ul></div><script>// 這行代碼很關鍵,請求時攜帶cookieaxios.defaults.withCredentials = true;axios.interceptors.response.use(response => {app.logs.push(JSON.stringify(response.data));return response;});var app = new Vue({el: '#app',data: {username: "test",password: "test",logs: []},methods: {login: async function() {await axios.post("http://localhost:3000/users/login", JSON.stringify({username: this.username,password: this.password}))},logout: async function() {await axios.post("http://localhost:3000/users/logout", JSON.stringify({username: this.username}))},getUser: async function() {await axios.get("http://localhost:3000/users/getUser");}}});</script>
</body></html>
  • 注:
  1. axios.defaults.withCredentials = true: 前端發出請求時,攜帶 cookie
  2. axios.post(url,params)時,params 一定要使用 JSON.stringify 轉換成 JSON 格式.否則會出現請求方法為 OPTION.
  3. axios.interceptors.response.use(cb): 對響應的信息進行攔截處理.
  • 下面搭一個最基礎的后端.
const Koa = require('koa')
const app = new Koa()// 路由
const Router = require('koa-router')
const router = new Router({ prefix: '/users' })router.post('/login', async ctx => {ctx.body = {ok: 1,message: '登錄成功'}
})router.post('/logout', async ctx => {ctx.body = {ok: 1,message: '登出成功'}
})router.post('/getUser', async ctx => {ctx.body = {ok: 1,message: '獲取用戶成功'}
})app.use(router.routes())
app.listen(3000)
  • 說明:
  1. const router = new Router({ prefix: '/users' }): 給路由添加一個前綴,即在后面 router.post(’/’,cb), 處理的是 http://localhost:3000/users 路由
  2. 以上的 html 是運行在 file 協議下(vscode 下使用 alt + B 快捷打開),而服務端是 http 協議.當 html 上通過 axios.post 方法請求服務器時,會發生跨域.于是下面需要添加跨域
  3. 由于使用到了 POST 方法,因此,在服務端也添加上 bodyParser.(注: bodyParser 一定要放在 koa-router 前面加載)
// post 請求解析
const bodyParser = require('koa-bodyparser')
app.use(bodyParser())// 跨域
const cors = require('koa2-cors')
app.use(cors())
  • 說明:
  1. 如果您按照我的代碼一步一步的敲,那么當您敲到這里,代碼應該理所當然的不能運行.打開 google 瀏覽器,在控制臺可以看見以下的一段話
  2. The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'.:提示的很明顯,就是說需要在返回頭部加上一個 “Access-Control-Allow-Credentials”: true 字段
  3. 根據 koa2 的洋蔥模型,只需在所有的路由前面加上如下代碼即可
router.post('*', async (ctx, next) => {ctx.set('Access-Control-Allow-Credentials', true)await next()
})
router.get('*', async (ctx, next) => {ctx.set('Access-Control-Allow-Credentials', true)await next()
})
  • 說明:
  1. 如果您按照我的代碼一步一步的敲,那么當您敲到這里基本的前后端交互算是完成了,下一步需要使用 session
  2. 首先看如下代碼:
// session(配置)
const session = require('koa-session')
app.kets = ['marron rain']const SESSION_CONFIG = {key: 'marron:session'
}
app.use(session(SESSION_CONFIG, app))// session(使用)
// 改寫login
router.post('/login', async ctx => {// 登錄邏輯ctx.session.userinfo = "marron";ctx.set("Content-Type", "application/json");ctx.body = {ok: 1,message: '登錄成功',}
})
router.post('/logout', async ctx => {delete ctx.session.userinfo;ctx.body = {ok: 1,message: '退出系統'}})router.get('/getUser', async ctx => {ctx.body = {ok: 1,message: '獲取用戶成功',userinfo: ctx.session.userinfo}
})
  • 說明:
  1. 此時,后端可以處理 登錄、登出、以及獲取信息.(僅僅只是根據不同路由返回不同的信息,并未進行邏輯處理)
  2. 實現簡單的邏輯
  • 在處理 getUser 路由請求時,先檢查一下session中是否有信息
  • 使用router.post 的第二個參數, 傳入中間件.
  • /login component/middleware/auth.js
module.exports = async (ctx, next) =>{if(!ctx.session.userinfo) {ctx.body = {ok: 0,message: '用戶未登錄'}} else {await next();}
}
  • router.get('/getUser')改寫如下:
router.get('/getUser', require('./middleware/auth'), async ctx =>{ctx.body = {ok: 1,message: '獲取用戶成功',userinfo: ctx.session.userinfo} 
})
  • 說明:
  1. 在執行回調函數之前,會先執行監測,檢查session中是否存在userinfo信息.
    在這里插入圖片描述
  2. 邏輯基本完成.但是此時的session信息只是存在內存中,并未真正實現持久化.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250515.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BZOJ2216: [Poi2011]Lightning Conductor

第一道此類的題&#xff0c;所以這是一篇假的博客&#xff0c;定理不會證明不理性 也不一定對 我是從這篇博客看的 很顯然是讓你求 p[i] max{a[j] sqrt(i - j)} - a[i] 就是 max{a[j] sqrt(|i - j|)} 這是一個 1D/1D 動態規劃 考慮對于絕對值的情況不好做&#xff0c;那就…

HNOI2018游記

HNOI2018游記 day 0 上午稍微寫了下題保持手感,然后看了一下套路,感覺不會的還是不會. 下午去劃水在湖面上被吹成傻逼... 感覺沒有聯賽前那么緊張了,應該是聯賽考掛了的原因吧.. day1 早上大概7:40就到了考場,和同學聊了一會兒天,看了看配置就進去了. 進去之后敲配置沒有一遍對…

Java 試題七

Java 試題七 1、java中有幾種類型的流&#xff1f;JDK為每種類型的流提供了一些抽象類以供繼承&#xff0c;請說出他們分別是哪些類&#xff1f; 答&#xff1a;字節流&#xff0c;字符流。 字節流繼承于InputStream、OutputStream&#xff0c; 字符流繼承于Reader、Writer…

flume快速入門及應用

? Flume 簡介? Flume 的安裝與配置? Fumne 部署   Flume 是 Cloudera 提供的一個高可用、 高可靠、 分布式的海量日志采集、 聚合和傳輸的系統。 Flume 支持定制各類數據源如 Avro、 Thrift、 Spooling 等。 同時 Flume提供對數據的簡單處理&#xff0c; 并將數據處理結果…

koa --- jwt實現最簡單的Token認證

HTML 有如下html: 先看代碼后挑重點來說明: <!DOCTYPE html><head><script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script src"https://unpkg.com/axios/dist/axios.min.js"></script></…

python基礎之常用的高階函數

前言 高階函數指的是能接收函數作為參數的函數或類&#xff1b;python中有一些內置的高階函數&#xff0c;在某些場合使用可以提高代碼的效率&#xff0e; map() map函數可以把一個迭代對象轉換成另一個可迭代對象&#xff0c;不過在python3中&#xff0c;結果都是一個map對象&…

Java 試題八

Java 試題八 1、java中有幾種方法可以實現一個線程&#xff1f;用什么關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用&#xff1f; 答&#xff1a;有兩種實現方法&#xff0c;分別是繼承Thread類與實現Runnable接口&#xff1b;用synchronized關鍵字修飾同步方法…

bzoj2957 奧妙重重的線段樹

https://www.lydsy.com/JudgeOnline/problem.php?id2957 線段樹的query和update竟然還可以結合起來用&#xff01; 題意&#xff1a;小A的樓房外有一大片施工工地&#xff0c;工地上有N棟待建的樓房。每天&#xff0c;這片工地上的房子拆了又建、建了又拆。他經常無聊地看著窗…

koa --- 使用Github OAuth登錄

準備 登錄github選擇右上角的setting Developer settings -> OAuth Apps -> Register a new application 填入基本信息 點擊綠色的按鈕,可以看見 client_id 和 client secret 理清思路: 開始時,一個登錄的連接,點擊連接.后臺監聽登錄(/login)路由,然后重定向到github…

[數據結構] - ArrayList探究

一 概述 ArrayList可以理解為動態數組&#xff0c;與java的數組相比&#xff0c;它的容量能動態曾長&#xff0c;ArrayList是List接口的可變數組的實現&#xff0c;允許包括null值在內的所有元素。除了實現List接口外&#xff0c;此類還提供一些方法來操作內部用來存儲列表的數…

10.10考試題

voteplus 【問題描述】 R 君博客上有?個投票板塊&#xff0c;?家可以使?投票的?式來表達??對某些問題的贊成或反對的意見。 投票結果是公開的&#xff0c;但是 R 君會把這個結果化成?個最簡分數&#xff0c;如 1:2,4:3。 注意到同?個最簡分數可能代表了不同的總?數&am…

koa --- 跨域,解析POST參數、路由配置

目標 將開發中經常遇見的問題寫在這里方便查詢. 使用Koa創建一個簡單的服務器 const Koa require("koa"); const app new Koa(); app.listen(3000, () >{console.log("[server] Server is running at http://localhost:3000") })使用koa2-cors解決…

mysql數據庫常用操作

目前最流行的數據庫&#xff1a; oracle、mysql、sqlserver、db2、sqline --&#xff1a;單行注釋 #&#xff1a;也是單行注釋 /* 注釋內容*/&#xff1a;多行注釋 mysql -uroot -p密碼&#xff1a;登錄mysql service mysqld restart重啟mysql /etc/my.cnfmysql的配置文件 /var…

數碼相機控制點的自動定位檢校

為簡化控制場相機檢校中的人工量測控制點的繁瑣工作,提高相機檢校精度,本文提出一種方法:只需均勻量測少量控制點的像方坐標獲取相機檢校初始參數,便可通過動態模板匹配實現單影像相機檢校的控制點高精度自動定位檢校。實驗證明此方法檢校精度與人工量測檢校精度相近。 https:/…

Java 常用類

Java 常用類 字符串相關類 String類&#xff1a;構造字符串對象 常量對象&#xff1a;字符串常量對象是用雙引號括起的字符序列。 例如&#xff1a;”你好”、”12.97”、”boy”等。 字符串的字符使用Unicode字符編碼&#xff0c;一個字符占兩個字節 String類較常用構…

koa --- restful規范及其栗子

遵循Restful規范的簡單的栗子 前端代碼: <html><head><script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script src"https://unpkg.com/element-ui/lib/index.js"></script><script src&qu…

軟工五:四則運算

題目要求 本次作業要求兩個人合作完成&#xff0c;駕駛員和導航員角色自定&#xff0c;鼓勵大家在工作期間角色隨時互換&#xff0c;這里會布置兩個題目&#xff0c;請各組成員根據自己的愛好任選一題。 題目一&#xff1a; 我們在剛開始上課的時候介紹過一個小學四則運算自動生…

Tomcat 配置Https

https://www.cnblogs.com/wanghaoyuhappy/p/5267702.html JDK1.8 keytool 生存證書 C:\keys\tomcat.keystore 1:證書生成 命令如下: keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -keystore C:/keys/tomcat.keytore -storepass 123456 keytool 使…

koa --- 使用koa-multer和element-ui組件上傳頭像

文件上傳 前端代碼 <script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src"https://unpkg.com/element-ui/lib/index.js"></script> <linkrel"stylesheet"href"https://unpkg.co…

PKUSC2018訓練日程(4.18~5.30)

(總計:共66題) 4.18~4.25&#xff1a;19題 4.26~5.2&#xff1a;17題 5.3~5.9: 6題 5.10~5.16: 6題 5.17~5.23: 9題 5.24~5.30: 9題 4.18 [BZOJ3786]星系探索(偽ETT) [BZOJ4337][BJOI2015]樹的同構(樹的最小表示法) [BZOJ3551][ONTAK2010]Peaks(加強版)(Kruskal重構樹,主席樹) …