一、目標(biāo)
- 能夠知道如何配置MySQL數(shù)據(jù)庫環(huán)境
- 能夠認(rèn)識并使用常見的SQL語句操作數(shù)據(jù)庫
- 能夠在Express中操作MySQL數(shù)據(jù)庫
- 能夠了解Session的實(shí)現(xiàn)原理
- 能夠了解JWT的實(shí)現(xiàn)原理
二、目錄
- 數(shù)據(jù)庫的概念
- 安裝并配置MySQL
- MySQL的基本使用
- 在Express中操作MySQL
- 前后端的身份認(rèn)證
1.數(shù)據(jù)庫的基本概念
1.1什么是數(shù)據(jù)庫
數(shù)據(jù)庫(database)是用來阻止、存儲和管理數(shù)據(jù)的倉庫。
為了方便管理互聯(lián)網(wǎng)世界中的數(shù)據(jù),就有了數(shù)據(jù)庫管理系統(tǒng)的概念。用戶可以對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行新增、查詢、更新、刪除等操作。
1.2常見的數(shù)據(jù)庫及分類
- MySQL數(shù)據(jù)庫(目前使用最廣泛、流行度最高的開源免費(fèi)數(shù)據(jù)庫;Community+Enterprise)
- Oracle數(shù)據(jù)庫(收費(fèi))
- SQL Server數(shù)據(jù)庫(收費(fèi))
- Mongodb數(shù)據(jù)庫(Community+Enterprise)
其中,MySQL、Oracle、SQL Server屬于傳統(tǒng)型數(shù)據(jù)庫(又叫做:關(guān)系型數(shù)據(jù)庫或SQL數(shù)據(jù)庫),這三者的設(shè)計(jì)理念相同,用法比較類似
而Mongodlb屬于新型數(shù)據(jù)庫(又叫做:非關(guān)系型數(shù)據(jù)庫或NoSQL數(shù)據(jù)庫),它在一定程度上彌補(bǔ)了傳統(tǒng)型數(shù)據(jù)庫的缺陷
1.3傳統(tǒng)型數(shù)據(jù)庫的數(shù)據(jù)組織結(jié)構(gòu)
?1.Excel的數(shù)據(jù)組織結(jié)構(gòu)
2.傳統(tǒng)型數(shù)據(jù)庫的數(shù)據(jù)組織結(jié)構(gòu)
?3.實(shí)際開發(fā)中庫、表、行、字段的關(guān)系
?2.安裝并配置MySQL
2.1了解需要安裝哪些MySQL相關(guān)的軟件
?2.2MySQL在Windows環(huán)境下的安裝
在windows環(huán)境下安裝MySQL,只需要運(yùn)行mysql-installer-community-8.0.19.0.msi這個(gè)安裝包,就能一次性將MySQL Server和MySQL Workbench安裝到自己的電腦上。
3、MySQL的基本使用
3.1使用MySQL Workbench管理數(shù)據(jù)庫
1.鏈接數(shù)據(jù)庫
2.了解主界面的組成部分
?3.創(chuàng)建數(shù)據(jù)庫
?4.創(chuàng)建數(shù)據(jù)表
DataType數(shù)據(jù)類型:
①int整數(shù)
②varchar(len)字符串
③tinyint(1)布爾值
字段的特殊標(biāo)識:
①PK(Primary Key)主鍵、唯一標(biāo)識
②NN(Not Null)值不允許為空
③UQ(Unique)值唯一
④AI(Auto Increment)值自動增長
⑤default默認(rèn)填寫的值:當(dāng)你輸入數(shù)據(jù)是不填寫,就自動給你填寫上
5.向表中寫入數(shù)據(jù)
?3.2使用SQL管理數(shù)據(jù)庫
1.什么是SQL
SQL(Structured Query Language)是結(jié)構(gòu)化查詢語言,專門用來訪問和處理數(shù)據(jù)庫的編程語言。能夠讓我們以編程的形式,操作數(shù)據(jù)庫里面的數(shù)據(jù)。
三個(gè)關(guān)鍵點(diǎn):
1.SQL是一門數(shù)據(jù)庫編程語言
2.使用SQK語言編寫出來的代碼,叫做SQL語句
3.SQL語言只能在關(guān)系型數(shù)據(jù)庫中使用(例如MySQL、Oracle、SQL Server)。非關(guān)系型數(shù)據(jù)庫(例如MOngodb)不支持SQL語言
2.SQL能做什么
?
?3.3SQL的select語句
1.語法
?注意:select中字母大小寫不影響
3.4SQL的INSERT INTO語句
1.語法
?2.示例
3.5SQL的UPDATA語句
1.語法
?3.6SQL的DELETE語句
1.語法
?2.示例
?3.7SQL的WHERE子句
1.語法
2.可以在WHERE子句中使用的運(yùn)算符
3.SQL的where 子句示例
?3.8SQL的AND和OR運(yùn)算符
1.語法
?3.9SQL的ORDER BY子句
1.語法
?4.ORDER BY子句-多重排序
?3.10SQL的COUNT(*)函數(shù)
1.語法
?2.使用as關(guān)鍵字
?4.在項(xiàng)目中操作MySQL
4.1在項(xiàng)目中操作數(shù)據(jù)庫的步驟
?①安裝操作MySQL數(shù)據(jù)庫的第三方模塊(mysql)
②通過mysql模塊連接到MySQL數(shù)據(jù)庫
③通過mysql模塊執(zhí)行SQL語句
?4.2安裝與配置mysql模塊
1.安裝mysql模塊
mysql模塊是托管與npm上的第三方模塊。它提供了在Node.js項(xiàng)目中鏈接和操作MySQL數(shù)據(jù)庫的能力。想要在項(xiàng)目中使用它,需要先運(yùn)行如下命令,將mysql安裝為項(xiàng)目的依賴包:
?2.配置mysql模塊
在使用mysql模塊操作MySQL數(shù)據(jù)庫之前,必須先對mysql模塊進(jìn)行必要的配置,主要的配置步驟如下:
//1.導(dǎo)入mysql模塊
const mysql = require('mysql');
//2.建立數(shù)據(jù)庫鏈接
const db = mysql.createPool({
host: "127.0.0.1", //數(shù)據(jù)庫的ip地址
user: "root", //登錄數(shù)據(jù)庫的賬號
password: "admin123", //登錄數(shù)據(jù)庫的密碼
database: 'my_db_01' //指定要操作哪個(gè)數(shù)據(jù)庫
})
?3.測試mysql模塊能否正常工作
調(diào)用db.query()函數(shù),指定要執(zhí)行的SQL語句,通過回調(diào)函數(shù)拿到執(zhí)行的結(jié)果:
//1.導(dǎo)入mysql模塊
const mysql = require('mysql');
//2.建立數(shù)據(jù)庫鏈接
const db = mysql.createPool({
host: "127.0.0.1", //數(shù)據(jù)庫的ip地址
user: "root", //登錄數(shù)據(jù)庫的賬號
password: "admin123", //登錄數(shù)據(jù)庫的密碼
database: 'my_db_01' //指定要操作哪個(gè)數(shù)據(jù)庫
})
//測試mysql模塊能否正常工作
db.query('select 1', (err, results) => {
//mysql模塊工作期間報(bào)錯(cuò)了
if (err) return console.log(err.message);
//能夠成功的執(zhí)行SQL語句
console.log(results)
})
4.3使用mysql模塊操作MySQL數(shù)據(jù)庫
1.查詢數(shù)據(jù)
const sqlStr = 'select * from my_db_01.users'
db.query(sqlStr, (err, results) => {
//查詢數(shù)據(jù)失敗
if (err) return console.log(err.message);
//查詢數(shù)據(jù)成功
//注意:如果執(zhí)行的是select查詢語句,則執(zhí)行的結(jié)果是數(shù)組
console.log(results)
})
2.插入數(shù)據(jù)
向users表中新增數(shù)據(jù),其中username為Spider-Man,password為pcc321.示例代碼如下:
?3.插入數(shù)據(jù)的便捷方式
向表中新增數(shù)據(jù)時(shí),如果數(shù)據(jù)對象的每個(gè)屬性和數(shù)據(jù)表的字段一一對應(yīng),則可以通過如下方式快速插入數(shù)據(jù):
?4.更新數(shù)據(jù)
?5.更新數(shù)據(jù)的便捷方式
6.刪除數(shù)據(jù)
在刪除數(shù)據(jù)時(shí),推薦根據(jù)id這樣的唯一標(biāo)識,來刪除對應(yīng)的數(shù)據(jù)。示例如下:
//1.導(dǎo)入mysql模塊
const mysql = require('mysql');
//2.建立數(shù)據(jù)庫鏈接
const db = mysql.createPool({
host: "127.0.0.1", //數(shù)據(jù)庫的ip地址
user: "root", //登錄數(shù)據(jù)庫的賬號
password: "admin123", //登錄數(shù)據(jù)庫的密碼
database: 'my_db_01' //指定要操作哪個(gè)數(shù)據(jù)庫
})
//刪除id為5的用戶
const sqlStr = 'delete from users where id=?'
db.query(sqlStr, 1, (err, results) => {
if (err) return console.log(err.message)
//注意:執(zhí)行delete之后,結(jié)果也是一個(gè)對象,也會包含affectedRows屬性
if (results.affectedRows === 1) {
console.log('刪除數(shù)據(jù)成功')
}
})
?7.標(biāo)記刪除
使用DELETE語句,會真正的把數(shù)據(jù)從表中刪除掉。為了保險(xiǎn)起見,推薦使用標(biāo)記刪除的形式,來模擬刪除的動作。
所謂的標(biāo)記刪除,就是在表中設(shè)置類似于status這樣的狀態(tài)字段,來標(biāo)記當(dāng)前這條數(shù)據(jù)是否被刪除。
當(dāng)用戶執(zhí)行了刪除的動作時(shí),我們并沒有執(zhí)行DELETE語句把數(shù)據(jù)刪除掉,而是執(zhí)行了UPDATE語句,將這條數(shù)據(jù)對應(yīng)的status字段標(biāo)記為刪除即可。
//1.導(dǎo)入mysql模塊
const mysql = require('mysql');
//2.建立數(shù)據(jù)庫鏈接
const db = mysql.createPool({
host: "127.0.0.1", //數(shù)據(jù)庫的ip地址
user: "root", //登錄數(shù)據(jù)庫的賬號
password: "admin123", //登錄數(shù)據(jù)庫的密碼
database: 'my_db_01' //指定要操作哪個(gè)數(shù)據(jù)庫
})
const sqlStr = 'update users set status=? where id=?'
db.query(sqlStr, [1, 4], (err, results) => {
if (err) return console.log(err.message)
//注意:執(zhí)行delete之后,結(jié)果也是一個(gè)對象,也會包含affectedRows屬性
if (results.affectedRows === 1) {
console.log('刪除數(shù)據(jù)成功')
}
})
5.前后端身份認(rèn)證
5.1Web開發(fā)模式
目前主流的Web開發(fā)模式有兩種,分別是:
①基于服務(wù)器渲染的傳統(tǒng)Web開發(fā)模式
②基于前后端分離的新型Web開發(fā)模式
1.服務(wù)器渲染的Web開發(fā)模式
服務(wù)器渲染的概念:服務(wù)器發(fā)送給客戶端的HTML頁面,是在服務(wù)器通過字符串的拼接,動態(tài)生成的。因此,客戶端不需要使用Ajax這樣的即使額外請求頁面的數(shù)據(jù)。示例代碼如下:
?2.服務(wù)器渲染的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
①前端耗時(shí)少。因?yàn)榉?wù)器端負(fù)責(zé)動態(tài)生成HTML內(nèi)容,瀏覽器只需要直接渲染頁面即可。尤其是移動端,更省電。
②有利于SEO。因?yàn)榉?wù)器響應(yīng)的是完整的HTML頁面內(nèi)容,所以爬蟲更容易爬取獲得信息,更有利于SEO。
缺點(diǎn):
①占用服務(wù)器資源。即服務(wù)器端完成HTML頁面內(nèi)容的拼接,如果請求較多,會對服務(wù)器造成一定的訪問壓力。
②不利于前后端分離,開發(fā)效率低。使用服務(wù)器端渲染,則無法進(jìn)行分工合作,尤其對于前端復(fù)雜度高的項(xiàng)目,不利于項(xiàng)目高效開發(fā)。
3.前后端分離的Web開發(fā)模式
前后端分離的概念:前后端分離的開發(fā)模式,依賴于Ajax技術(shù)的廣泛應(yīng)用。簡而言之,前后端分離的Web開發(fā)模式,就是后端只負(fù)責(zé)提供API接口,前端使用Ajax調(diào)用接口的開發(fā)模式。
4.前后端分離的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
①開發(fā)體驗(yàn)好。前端專注于UI頁面的開發(fā),后端專注于api的開發(fā),且前端有更多的選擇性。
②用戶體驗(yàn)好。Ajax技術(shù)的廣泛應(yīng)用,極大地提高了用戶的體驗(yàn),可以輕松實(shí)現(xiàn)頁面的局部刷新。
③減輕了服務(wù)器端的渲染壓力。因?yàn)轫撁孀罱K是在每個(gè)用戶的瀏覽器中生成的。
缺點(diǎn):
①不利于SEO。因?yàn)橥暾腍TML頁面需要在客戶端動態(tài)拼接完成,所以爬蟲對無法爬取頁面的有效信息。(解決方案:利用Vue、React等前端框架的ssr(server side render)技術(shù)能夠很好的解決SEO問題?。?/p>
5.如何選擇Web開發(fā)模式
不談業(yè)務(wù)場景而盲目選擇使用何種開發(fā)模式都是耍流氓
- 比如企業(yè)級網(wǎng)站,主要功能是展示而沒有復(fù)雜的交互,并且需要良好的SEO,則這時(shí)我們就需要使用服務(wù)器端渲染;
- 而類似后臺管理項(xiàng)目,交互性比較強(qiáng)不需要考慮SEO,那么就可以使用前后端分離的開發(fā)模式。
另外,具體使用何種開發(fā)模式并不是絕對的,為了同時(shí)兼顧了首頁的渲染速度和前后端分離的開發(fā)效率,一些網(wǎng)站采用了首屏服務(wù)器端渲染+其他頁面前后端分離的開發(fā)模式。
5.2身份認(rèn)證
1.什么是身份認(rèn)證
身份認(rèn)證(Authentication)又稱“身份認(rèn)證”、“鑒權(quán)”,是通過一定的手段,完成對用戶身份的確認(rèn)。
- 在Web開發(fā)中,也涉及到用戶身份的認(rèn)證,例如:各大網(wǎng)站的手機(jī)驗(yàn)證碼登錄、郵箱密碼登錄、二維碼登錄等等。
2.為什么需要身份認(rèn)證
身份認(rèn)證的目的,是為了確認(rèn)當(dāng)前所聲稱為某種身份的用戶,確實(shí)是所聲稱的用戶。例如,你去找快遞員取快遞,你要怎么證明這份快遞是你的。
3.不同開發(fā)模式下的身份認(rèn)證
對于服務(wù)器渲染和前后端這兩種開發(fā)模式來說,分別有著不同的身份認(rèn)證方案:
①服務(wù)器渲染推薦使用Session認(rèn)證機(jī)制
②前后端分離推薦使用JWT認(rèn)證機(jī)制。
5.3Session認(rèn)證機(jī)制
1.HTTP協(xié)議的無狀態(tài)性
了解HTTP協(xié)議的無狀態(tài)性是進(jìn)一步學(xué)習(xí)Session認(rèn)證機(jī)制的必要前提。
HTTP協(xié)議的無狀態(tài)性,指的是客戶端的每次HTTP請求都是獨(dú)立的,連續(xù)多個(gè)請求之間沒有直接的關(guān)系,服務(wù)器不會主動保留每次HTTP請求的狀態(tài)。
?2.如何突破HTTP無狀態(tài)的限制
對于超市來說,為了方便收銀員在進(jìn)行結(jié)算時(shí)給VIP用戶打折,超市可以為每個(gè)VIP用戶發(fā)放會員卡。
?注意:現(xiàn)實(shí)生活中的會員卡身份認(rèn)證方式,在web開發(fā)中的專業(yè)術(shù)語叫做Cookie.
3.什么是Cookie
Cookie是存儲在用戶瀏覽器中的一段不超過4KB的字符串。它由一個(gè)名稱(Name)、一個(gè)值(Value)和其他幾個(gè)用于控制Cookie有效期、安全性、使用范圍的可選屬性組成。
不同域名下的Cookie各自獨(dú)立,每當(dāng)客戶端發(fā)起請求時(shí),會自動把當(dāng)前域名下所有未過期的Cookie一同發(fā)送到服務(wù)器。
Cookie的幾大特性:
①自動發(fā)送
②域名獨(dú)立
③過期時(shí)限
④4KB限制
?4.Cookie在身份認(rèn)證中的作用
客戶端第一次請求服務(wù)器的時(shí)候,服務(wù)器通過響應(yīng)頭的形式,向客戶端發(fā)送一個(gè)身份認(rèn)證的Cookie,客戶端會自動將Cookie保存在瀏覽器中。
隨后,當(dāng)客戶端瀏覽器每次請求服務(wù)器的時(shí)候,瀏覽器會自動將身份認(rèn)證相關(guān)的Cookie,通過請求頭的形式發(fā)送給服務(wù)器,服務(wù)器即可驗(yàn)明客戶端的身份。
5.Cookie不具有安全性
由于 Cookie是存儲在瀏覽器中的,而且瀏覽器也提供了讀寫Cookie的API,因此Cookie很容易被偽造,不具有安全性。因此不建議服務(wù)器將重要的隱私數(shù)據(jù),通過Cookie的形式發(fā)送給瀏覽器。
?6.提高身份認(rèn)證的安全性
為了防止客戶偽造會員卡,收銀員在拿到客戶出示的會員卡之后,可以在收銀機(jī)上進(jìn)行刷卡認(rèn)證,只有收銀機(jī)確認(rèn)存在的會員卡,才能使用。
這種“會員卡+刷卡認(rèn)證”的設(shè)計(jì)理念,就是Session認(rèn)證機(jī)制的精髓。?
7.Session的工作原理
5.4在Express中使用Session認(rèn)證
1.express-session中間件
在Express項(xiàng)目中,只需要安裝express-session中間件,即可在項(xiàng)目中使用Session認(rèn)證:
2.配置express-session中間件
express-session中間件安裝成功后,需要通過app.use()來注冊session中間件,示例代碼如下:
3.向session中存數(shù)據(jù)
當(dāng)express-session中間件配置成功后,即可通過req.session來訪問和使用session對象,從而存儲用戶的關(guān)鍵信息:
?4.從session中取數(shù)據(jù)
可以直接從req.session對象上獲取之前存儲的數(shù)據(jù),示例代碼如下:
5.清空session
調(diào)用req.session.destory()函數(shù),即可清空服務(wù)器保存的session信息。
5.5JWT認(rèn)證機(jī)制
1.了解Session認(rèn)證的局限性
Session認(rèn)證機(jī)制需要配合Cookie才能實(shí)現(xiàn)。由于Cookie默認(rèn)不支持跨域訪問,所以,當(dāng)涉及到前端跨域請求后端接口的時(shí)候,需要做很多額外的配置,才能實(shí)現(xiàn)跨域Session認(rèn)證。
注意:
- 當(dāng)前段請求后端接口不存在跨域問題的時(shí)候,推薦使用Session身份認(rèn)證機(jī)制。
- 當(dāng)前端需要跨域請求后端接口的時(shí)候,不推薦使用Session身份認(rèn)證機(jī)制,推薦使用JWT認(rèn)證機(jī)制。
?2.什么是JWT
JWT(JSON Web Token)是目前最流行的跨域認(rèn)證解決方案。
3.JWT的工作原理
總結(jié):用戶的信息通過Token字符串的形式,保存在客戶端瀏覽器中。服務(wù)器通過還原Token字符串的形式來認(rèn)證用戶的身份。
4.JWT的組成部分
?JWT通常由三部分組成,分別是Header(頭部)、Payload(有效荷載)、Signature(簽名)。
?6.JWT的三個(gè)部分各自代表的含義
JWT的三個(gè)組成部分,從前到后分別是:Header、Payload、Signatyre
其中:
- Payload部分才是真正的用戶信息,它是用戶信息經(jīng)過加密之后生成的字符串
- Header和Signature是安全性相關(guān)的部分,只是為了保證Token的安全性
7.JWT的使用方式
客戶端收到 服務(wù)器返回的JWT之后,通常會將它存儲在localStorage或sessionStorage中
此后,客戶端每次與服務(wù)器通信,都要帶上這個(gè)JWT的字符串,從而進(jìn)行身份認(rèn)證。推薦的做法是把JWT放在HTTP請求頭的Authorization字段中,格式如下:
5.6在Express中使用JWT
1.安裝JWT相關(guān)的包
運(yùn)行如下命令,安裝如下兩個(gè)JWT相關(guān)的包:
?其中:
- jsonwebtoken用于生成JWT字符串
- express-jwt用于將JWT字符串解析還原成JSON對象
2.導(dǎo)入JWT相關(guān)的包
使用require()函數(shù),分別導(dǎo)入JWT相關(guān)的兩個(gè)包:
?3.定義secret密鑰
為了保證JWT字符串的安全性,防止JWT字符串在網(wǎng)絡(luò)傳輸過程中被別人破解,我們需要專門定義一個(gè)用于加密和解密的secret密鑰:
①當(dāng)生成JWT字符串的時(shí)候,需要使用secret密鑰對用戶的信息進(jìn)行加密,最終得到加密好的JWT字符串。
②當(dāng)把JWT字符串解析還原成JSON對象的時(shí)候,需要使用secret密鑰進(jìn)行解密。
?4.在登錄成功后生成JWT字符串
調(diào)用jsonwebtoken包提供的sign()方法,將用戶的信息加密成JWT字符串,響應(yīng)給客戶端:
5.將JWT字符串還原為JSON對象
客戶端每次?在訪問那些有權(quán)限接口的時(shí)候,都需要主動通過請求頭中的Authorization字段,將Token字符串發(fā)送到服務(wù)器。
此時(shí),服務(wù)器可以通過express-jwt這個(gè)中間件,自動將客戶端發(fā)送過來的Token解析還原成JSON對象:
6.使用req.user獲取用戶信息
當(dāng)express-jwt這個(gè)中間件配置成功之后,即可在那些有權(quán)限的接口中,使用req.user對象,來訪問從JWT字符串中解析出來的用戶信息了,示例代碼如下:
7.捕獲解析JWT失敗后產(chǎn)生的錯(cuò)誤
當(dāng)使用express-jwt解析Token字符串時(shí),如果客戶端發(fā)送過來的Token字符串過期或不合法,會產(chǎn)生一個(gè)解析失敗的錯(cuò)誤,影響項(xiàng)目的正常運(yùn)行。我們可以通過Express的錯(cuò)誤中間件,捕獲這個(gè)錯(cuò)誤并進(jìn)行相關(guān)的處理,示例代碼如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-499018.html
? ?文章來源地址http://www.zghlxwxcb.cn/news/detail-499018.html
到了這里,關(guān)于數(shù)據(jù)庫與身份認(rèn)證的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!