新聞中心
基于Redis的登錄應(yīng)用實(shí)踐

專(zhuān)注于為中小企業(yè)提供做網(wǎng)站、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)惠濟(jì)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
Redis是一款高性能的內(nèi)存數(shù)據(jù)庫(kù),支持多種數(shù)據(jù)類(lèi)型,具備豐富的功能和優(yōu)良的性能表現(xiàn),廣泛應(yīng)用于緩存、隊(duì)列、分布式鎖等場(chǎng)景。本文將介紹如何基于Redis開(kāi)發(fā)一個(gè)簡(jiǎn)單的登錄應(yīng)用,此應(yīng)用可以實(shí)現(xiàn)用戶(hù)注冊(cè)、登錄、退出等基本操作,并且使用Redis來(lái)存儲(chǔ)登錄狀態(tài),保證用戶(hù)體驗(yàn)。
實(shí)現(xiàn)思路
用戶(hù)注冊(cè):用戶(hù)輸入注冊(cè)信息,包括賬號(hào)、密碼等信息,將這些信息提交給服務(wù)器。服務(wù)器將賬號(hào)、密碼、當(dāng)前時(shí)間戳等信息合并為一個(gè)字符串,并將其作為鍵,將用戶(hù)信息作為值,存儲(chǔ)到Redis中。同時(shí)為了避免重復(fù)注冊(cè),需要在Redis中存儲(chǔ)一個(gè)賬號(hào)集合,將每個(gè)注冊(cè)的賬號(hào)存儲(chǔ)在該集合中。
用戶(hù)登錄:用戶(hù)輸入賬號(hào)、密碼,將其提交給服務(wù)器。服務(wù)器在Redis中查找該賬號(hào)對(duì)應(yīng)的信息,如果存在則比對(duì)密碼是否正確。如果賬號(hào)和密碼都正確,則在Redis中生成一個(gè)唯一的session id,并將該用戶(hù)的登錄狀態(tài)存儲(chǔ)到Redis中,同時(shí)將session id和用戶(hù)信息一起作為值存儲(chǔ)到Redis中,并設(shè)置session id對(duì)應(yīng)的鍵的過(guò)期時(shí)間,通常設(shè)置為30分鐘,這樣可以避免登錄狀態(tài)過(guò)期時(shí)間過(guò)短或過(guò)長(zhǎng)的問(wèn)題。最后將session id返回給用戶(hù)。
用戶(hù)退出:用戶(hù)點(diǎn)擊退出按鈕,將session id提交給服務(wù)器。服務(wù)器根據(jù)session id在Redis中查找對(duì)應(yīng)的用戶(hù)信息,并刪除該信息,同時(shí)刪除該session id對(duì)應(yīng)的鍵,用戶(hù)退出成功。
代碼實(shí)現(xiàn)
本文將使用Node.js來(lái)實(shí)現(xiàn)登錄應(yīng)用,使用redis-py進(jìn)行Redis操作。以下是服務(wù)器端的代碼示例:
“`javascript
const express = require(‘express’);
const bodyParser = require(‘body-parser’);
const redis = require(‘redis’);
const uuidv4 = require(‘uuid/v4’);
const app = express();
const client = redis.createClient();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// 用戶(hù)注冊(cè)
app.post(‘/register’, (req, res) => {
const { Username, password } = req.body;
const now = Date.now();
const key = `${username}:${password}:${now}`;
client.sadd(‘usernames’, username);
client.set(key, JSON.stringify({ username, password, registeredAt: now }));
res.send(‘注冊(cè)成功!’);
});
// 用戶(hù)登錄
app.post(‘/login’, (req, res) => {
const { username, password } = req.body;
const key = `${username}:${password}:*`;
client.keys(key, (err, keys) => {
if (err) {
console.error(err);
return res.send(‘登錄失??!’);
}
if (keys.length === 0) {
return res.send(‘用戶(hù)名或密碼錯(cuò)誤!’);
}
const userKey = keys[0];
// 判斷密碼是否正確
client.get(userKey, (err, str) => {
if (err || !str) {
console.error(err);
return res.send(‘登錄失??!’);
}
const user = JSON.parse(str);
if (user.password !== password) {
return res.send(‘用戶(hù)名或密碼錯(cuò)誤!’);
}
// 向Redis中添加登錄狀態(tài)
const sessionId = uuidv4();
client.set(sessionId, user.username);
client.expire(sessionId, 1800);
res.cookie(‘sessionId’, sessionId);
res.send(‘登錄成功!’);
});
});
});
// 用戶(hù)退出
app.post(‘/logout’, (req, res) => {
const { sessionId } = req.cookies;
client.del(sessionId, (err, count) => {
if (err) {
console.error(err);
res.send(‘退出失敗!’);
} else {
res.clearCookie(‘sessionId’);
res.send(‘退出成功!’);
}
});
});
app.listen(3000, () => {
console.log(‘應(yīng)用啟動(dòng)了…’);
});
可以看到,服務(wù)器端使用Redis來(lái)存儲(chǔ)注冊(cè)的用戶(hù)信息、用戶(hù)登錄狀態(tài)等,其中sadd方法用于向Redis中添加用戶(hù)名集合,set用于存儲(chǔ)用戶(hù)信息,keys方法用于查找用戶(hù)信息,get用于獲取用戶(hù)信息,set用于存儲(chǔ)登錄狀態(tài),expire用于設(shè)置過(guò)期時(shí)間,del用于刪除鍵。
客戶(hù)端的代碼示例如下:
```javascript
const registerForm = document.querySelector('#registerForm');
const loginForm = document.querySelector('#loginForm');
const logoutButton = document.querySelector('#logoutButton');
// 用戶(hù)注冊(cè)
registerForm.addEventListener('submit', (event) => {
event.preventDefault();
const formData = new FormData(registerForm);
const username = formData.get('username');
const password = formData.get('password');
fetch('/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ username, password }),
}).then((response) => {
if (response.ok) {
alert('注冊(cè)成功!');
} else {
alert('注冊(cè)失??!');
}
});
});
// 用戶(hù)登錄
loginForm.addEventListener('submit', (event) => {
event.preventDefault();
const formData = new FormData(loginForm);
const username = formData.get('username');
const password = formData.get('password');
fetch('/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ username, password }),
credentials: 'same-origin',
}).then((response) => {
if (response.ok) {
alert('登錄成功!');
} else {
alert('登錄失?。?);
}
});
});
// 用戶(hù)退出
logoutButton.addEventListener('click', () => {
fetch('/logout', {
method: 'POST',
credentials: 'same-origin',
}).then((response) => {
if (response.ok) {
alert('退出成功!');
location.href = '/';
} else {
alert('退出失??!');
}
});
});
可以看到,客戶(hù)端使用fetch方法向服務(wù)器端發(fā)送請(qǐng)求,其中credentials設(shè)置為’same-origin’,表示只有在同一域名下才會(huì)發(fā)送cookie,可以保證登錄狀態(tài)有效。
總結(jié)
本文介紹了如何基于Redis開(kāi)發(fā)一個(gè)簡(jiǎn)單的登錄應(yīng)用,該應(yīng)用使用Redis存儲(chǔ)用戶(hù)信息和用戶(hù)狀態(tài),保證了用戶(hù)在不同設(shè)備、不同瀏覽器中的登錄狀態(tài)一致。使用Redis可以提高應(yīng)用的性能和可擴(kuò)展性,將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,可以減少I(mǎi)O操作和磁盤(pán)讀寫(xiě),增強(qiáng)應(yīng)用的響應(yīng)速度和并發(fā)能力。同時(shí)Redis具備輕量級(jí)、可靠性高、易于部署和使用等優(yōu)點(diǎn),非常適合用于緩存、隊(duì)列等場(chǎng)景。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專(zhuān)業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享文章:基于Redis的登錄應(yīng)用實(shí)踐(redis登錄應(yīng)用)
路徑分享:http://www.5511xx.com/article/dhjgheo.html


咨詢(xún)
建站咨詢(xún)
