日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
基于Redis的登錄應(yīng)用實(shí)踐(redis登錄應(yīng)用)

基于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