亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

cookie和session(宇宙級框架express)

2019-11-11 04:43:06
字體:
來源:轉載
供稿:網友

首先,我必須義正言辭的吐槽一下這個宇宙級框架!exPRess3.x和expss4.x差別怎么就那么大呢?找了好多資料來學習,但總是莫名其妙的報錯,一開始我以為是因為我長得不好看,后來發現。。。我用的是4.x的express,而教程是3.x的,好多都對不上號。我@#¥%……&*()&……¥

好了,吐槽結束,進入正題。作為一個勵志改變世界的程序員,我們必須緊跟時代的潮流,所以nodejs死亡筆記都是基于express4.x的。本篇文章將講解cookie和session。

我之前寫過一篇express項目搭建的博客,所以如何搭建我就不說了。

在web應用中,多個請求之間共享“用戶會話”是非常必要的。但HTTP1.0協議是無狀態的。那這時Cookie就出現了。那Cookie又是如何處理的呢?

Cookie的處理:

服務端向客戶端發送Cookie客戶端的瀏覽器把Cookie保存然后在每次請求瀏覽器都會將Cookie發送到服務端

在HTML文檔被發送之前,Web服務器通過傳送HTTP 包頭中的Set-Cookie 消息把一個cookie 發送到用戶的瀏覽器中,如下示例:

Set-Cookie: name=value; Path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT;11

其中比較重要的屬性:

name=value:鍵值對,可以設置要保存的 Key/Value,注意這里的 name 不能和其他屬性項的名字一樣Expires: 過期時間(秒),在設置的某個時間點后該 Cookie 就會失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMTmaxAge: 最大失效時間(毫秒),設置在多少后失效secure: 當 secure 值為 true 時,cookie 在 HTTP 中是無效,在 HTTPS 中才有效Path: 表示 cookie 影響到的路,如 path=/。如果路徑不能匹配時,瀏覽器則不發送這個Cookie

cookie在express中的使用

express 在 4.x 版本之后,管理session和cookies等許多模塊都不再直接包含在express中, `而是需要單獨下載安裝相應模塊。

cookieParser安裝: $ npm install cookie-parser

通過express命令創建的項目會自動將這個模塊安裝。

使用方法:

app.get('/', function (req, res) { // 如果請求中的 cookie 存在 isVisit, 則輸出 cookie // 否則,設置 cookie 字段 isVisit, 并設置過期時間為1分鐘 if (req.cookies.isVisit) { console.log(req.cookies); res.send("再次歡迎訪問"); } else { res.cookie('isVisit', 1, {maxAge: 60 * 1000}); res.send("歡迎第一次訪問"); }});12345678910111234567891011

session

什么是session?

session是另一種記錄客戶狀態的機制,不同的是Cookie保存在客戶端瀏覽器中,而session保存在服務器上。

客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,這就是session??蛻舳藶g覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。

如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那么session機制就是通過檢查服務器上的“客戶明細表”來確認客戶身份。

session相當于程序在服務器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。

兩者的區別:

cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。

cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙 考慮到安全應當使用session。

session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能 考慮到減輕服務器性能方面,應當使用COOKIE。

單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。

所以建議:將登陸信息等重要信息存放為session、其他信息如果需要保留,可以放在cookie中

express中的session

跟cookie一樣都需要單獨的安裝和引用模塊, 安裝模塊:

$npm install express-session11

這個模塊沒有默認安裝,需要自己手動安裝,并引入: var session = require('express-session');

這個模塊的主要的方法是 session(options),其中 options 中包含可選參數,主要有:

name: 設置 cookie 中,保存 session 的字段名稱,默認為 connect.sid 。store: session 的存儲方式,默認存放在內存中,也可以使用 redis,mongodb 等。express 生態中都有相應模塊的支持。secret: 通過設置的 secret 字符串,來計算 hash 值并放在 cookie 中,使產生的 signedCookie防篡改。cookie: 設置存放 session id 的 cookie 的相關選項,默認為 (default: { path: ‘/’,httpOnly: true, secure: false, maxAge: null })genid: 產生一個新的 session_id 時,所使用的函數, 默認使用 uid2 這個 npm 包。rolling: 每個請求都重新設置一個 cookie,默認為 false。resave: 即使 session 沒有被修改,也保存 session 值,默認為 true。

使用方法:

app.use(session({ secret: 'hubwiz app', //secret的值建議使用隨機字符串 cookie: {maxAge: 60 * 1000 * 30} // 過期時間(毫秒)}));app.get('/session', function (req, res) { if (req.session.sign) {//檢查用戶是否已經登錄 console.log(req.session);//打印session的值 res.send('welecome <strong>' + req.session.name + '</strong>, 歡迎你再次登錄'); } else { req.session.sign = true; req.session.name = 'https://github.com/CleverFan'; res.send('歡迎登陸!'); }});12345678910111213141234567891011121314

session的持久化

重新運行npm start,然后刷新訪問測試頁面。我們會發現session丟了! 這是因為session會默認的存儲到內存當中。也就是說session數據都是存儲在內存當中的,當進程退出后,session數據就會丟失。

在開發環境中,這也許并不算什么壞事。但是如果線上的應用是這樣的,用戶絕對是不能忍受的。所以,我們需要將session數據 持久化存儲。

首先我們講解如何把session存儲到mongodb數據庫當中:

在使用MongoDB存儲時首先要加載一個模塊:connect-mongo以及mongoose

安裝命令: npm install connect-mongo npm install mongoose

var mongoose = require("mongoose");var session = require('express-session');var MongoStore = require('connect-mongo/es5')(session);mongoose.connect('mongodb://127.0.0.1:27017/sessiontest'); //連接數據庫mongoose.connection.on('open', function () { console.log('-----------數據庫連接成功!------------');});app.use(session({ secret: "what do you want to do?", //secret的值建議使用隨機字符串 cookie: {maxAge: 60 * 1000 * 60 * 24 * 14}, //過期時間 resave: true, // 即使 session 沒有被修改,也保存 session 值,默認為 true saveUninitialized: true, store: new MongoStore({ mongooseConnection: mongoose.connection //使用已有的數據庫連接 })}));123456789101112131415161718123456789101112131415161718mongodb我就不講了,不是本文重點,需要創建sessiontest數據庫。11

Redis是一個非常適合用于Session管理的數據庫。

它的結構簡單,key-value的形式非常符合SessionID-UserID的存儲;讀寫速度非常快;自身支持數據自動過期和清除;語法、部署非常簡單。

基于以上原因,很多Session管理都是基于Redis實現的。所以我們這個示例將用redis管理session。

Express已經將Session管理的整個實現過程簡化到僅僅幾行代碼的配置的地步了,你完全不用理解整個session產生、存儲、返回、過期、再頒發的結構,使用Express和Redis實現Session管理,只要兩個中間件就足夠了:

express-sessionconnect-redis

參數

client 你可以復用現有的redis客戶端對象, 由 redis.createClient() 創建host Redis服務器名port Redis服務器端口socket Redis服務器的unix_socket

可選參數

ttl Redis session TTL 過期時間 (秒)disableTTL 禁用設置的 TTLdb 使用第幾個數據庫pass Redis數據庫的密碼prefix 數據表前輟即schema, 默認為 “sess:”

如何使用:

var express = require('express');var session = require('express-session');var RedisStore = require('connect-redis')(session);var app = express();var options = { "host": "127.0.0.1", "port": "6379", "ttl": 60 * 60 * 24 * 30, //session的有效期為30天(秒)};// 此時req對象還沒有session這個屬性app.use(session({ store: new RedisStore(options), secret: 'express is powerful'}));1234567891011121314151612345678910111213141516

沒有實際應用的博客不是好博客

最后,用一個簡單的登錄驗證小項目結束本篇文章。

index.ejs:

<form action="/sign" method="post"> <fieldset> <legend>Please sign in</legend> <p>User: <input type="text" name="user"/></p> <p>Pass: <input type="text" name="passWord"/></p> <button>Submit</button> </fieldset></form>123456789123456789

sign.ejs

<!doctype html><html><head> <title>session</title></head><body> <!--登錄成功展示的內容--> <p>welecome <strong> <%=session.name%> </strong>, 歡迎你再次登錄<a href="/out"></a></p></body></html>1234567891012345678910

user.json

{ "admin":{ "password": "admin", "name": "demo" }}123456123456

admin為登錄用戶名,password為登錄密碼,name為用戶昵稱。

app.js

var express = require('express');var path = require('path');var favicon = require('serve-favicon');var logger = require('morgan');var cookieParser = require('cookie-parser');var bodyParser = require('body-parser');var session = require('express-session');var routes = require('./routes/index');var user = require('./user.json');var app = express();// view engine setupapp.set('views', path.join(__dirname, 'views'));app.set('view engine', 'ejs');// uncomment after placing your favicon in /public//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));app.use(logger('dev'));app.use(bodyParser.json());app.use(bodyParser.urlencoded({ extended: false }));app.use(cookieParser());app.use(express.static(path.join(__dirname, 'public')));// app.use('/', routes);// app.use('/users', users);app.use(session({ secret: 'secret', //為了安全性的考慮設置secret屬性 cookie: {maxAge: 60 * 1000 * 30}, //設置過期時間 resave: true, // 即使 session 沒有被修改,也保存 session 值,默認為 true saveUninitialized: false, //}));app.get('/', function (req, res) { if (req.session.sign) {//檢查用戶是否已經登錄,如果已登錄展現的頁面 console.log(req.session);//打印session的值 res.render('sign.ejs', {session:req.session}); } else {//否則展示index頁面 res.render('index.ejs', {title: 'index'}); }});//登錄表單處理app.post('/sign', function (req, res) { //登錄的數據和user.json中的數據進行對比 if(!user[req.body.user]){ res.end("input wrong"); } if (req.body.password != user[req.body.user].password || !user[req.body.user]) { res.end('sign failure'); } else { req.session.sign = true; req.session.name = user[req.body.user].name; res.send('welecome <strong>' + req.session.name + '</strong>,<a href="/out">登出</a>'); }});app.get('/out', function(req, res){ req.session.destroy(); res.redirect('/');});// catch 404 and forward to error handlerapp.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err);});// error handlers// development error handler// will print stacktraceif (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); });}// production error handler// no stacktraces leaked to userapp.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} });});module.exports = app;12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697981234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798

現在啟動項目,就可以使用這個demo了。

項目源代碼我會放在github上,感興趣的可以去下載。 github地址:https://github.com/CleverFan/nodejsStudy/tree/master/expressTest/day02_session

歡迎大家和我討論,畢竟我也是個萌新-.-


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色婷婷综合久久久久| 亚洲自拍欧美另类| 97成人精品区在线播放| 欧美在线www| 国产精品视频男人的天堂| 国产美女91呻吟求| 69av成年福利视频| 91国产中文字幕| 成人av资源在线播放| 欧美性猛交xxxx黑人| 精品福利樱桃av导航| 日韩精品免费在线| 国产一区二区视频在线观看| 国产精品久久在线观看| 日韩国产精品视频| 精品国产乱码久久久久久虫虫漫画| 欧美裸体xxxx极品少妇| 国产一区二区日韩精品欧美精品| 国产精品va在线播放| 自拍偷拍亚洲一区| 三级精品视频久久久久| 日韩视频免费观看| 亚洲自拍偷拍区| 国产精品久久久久久五月尺| 亚洲欧洲在线视频| 久国内精品在线| 欧美日韩在线视频首页| 2025国产精品视频| 精品综合久久久久久97| 全亚洲最色的网站在线观看| 亚洲国产精品久久久久秋霞不卡| 亚洲午夜av久久乱码| 91精品国产色综合| 国内精品中文字幕| 欧美激情一区二区久久久| 欧美性色xo影院| 91久久国产综合久久91精品网站| 热久久99这里有精品| 亚洲精品一区中文| 久久电影一区二区| 欧美在线观看一区二区三区| 亚洲精品一区二区三区不| 92国产精品视频| 在线国产精品播放| 国产精品精品一区二区三区午夜版| 精品亚洲va在线va天堂资源站| 亚洲一区二区三区在线免费观看| 国语自产偷拍精品视频偷| 国产精品夜间视频香蕉| 精品中文字幕乱| 国产一区二区丝袜高跟鞋图片| 中文字幕欧美精品日韩中文字幕| 国产精品扒开腿做爽爽爽视频| 亚洲2020天天堂在线观看| 久热精品视频在线免费观看| 欧美成aaa人片在线观看蜜臀| 亚洲v日韩v综合v精品v| 成人欧美在线视频| 久久久女女女女999久久| 一区二区三区回区在观看免费视频| 国产午夜精品全部视频在线播放| 国产+成+人+亚洲欧洲| 国产午夜精品全部视频播放| 久久夜色精品国产亚洲aⅴ| 伊人久久久久久久久久久| 欧美亚洲日本网站| 久久精品2019中文字幕| 亚洲第一页在线| 日韩成人在线观看| 一区二区三区四区在线观看视频| 日韩国产精品一区| 国产一区二区三区在线看| 国产精品高清在线观看| 亚洲女人天堂视频| 日本精品一区二区三区在线播放视频| 国产成人精品在线视频| 国产成人自拍视频在线观看| 国产成人av在线| 国产精品第一区| 日韩在线观看免费网站| 欧美激情亚洲另类| 亚洲一区二区三| 国产精品自产拍在线观| 欧美中文在线观看国产| 成人久久一区二区| 欧美日韩美女视频| 欧美另类极品videosbest最新版本| 日韩在线观看视频免费| 国产精品视频yy9099| 成人欧美在线视频| 成人黄色免费网站在线观看| 亚洲在线免费视频| 亚洲大尺度美女在线| 插插插亚洲综合网| 欧美一级大片在线观看| 久热精品视频在线观看| 日韩视频永久免费观看| 成人女保姆的销魂服务| 伊人伊成久久人综合网小说| 国产视频观看一区| 欧美成人在线影院| 日韩精品在线免费| 久久亚洲一区二区三区四区五区高| 精品久久久久久久久久久| 久久影视电视剧免费网站清宫辞电视| 日韩电影中文字幕一区| 欧美野外wwwxxx| 97在线免费观看视频| 亚洲色图欧美制服丝袜另类第一页| 欧美激情亚洲精品| 欧美成人亚洲成人| 欧美电影免费观看大全| 亚洲欧美在线播放| 九九热这里只有精品免费看| 日本一区二三区好的精华液| 高清欧美电影在线| 热久久99这里有精品| 欧美在线观看网址综合| 久久天天躁狠狠躁老女人| 久久亚洲精品一区二区| 久久精品国产亚洲一区二区| 国语自产偷拍精品视频偷| 亚洲国产又黄又爽女人高潮的| 亚洲一区二区三区777| 中文字幕国产精品久久| 91免费福利视频| 久久久国产在线视频| 精品偷拍各种wc美女嘘嘘| 曰本色欧美视频在线| 国产有码一区二区| 亚洲国产成人91精品| 欧美在线免费视频| 国产精品1区2区在线观看| 亚洲欧美中文字幕在线一区| 亚洲男人av电影| 日韩国产精品亚洲а∨天堂免| 亚洲欧美日韩国产中文| 国产欧美一区二区三区久久| 欧美在线观看网址综合| 97国产精品视频人人做人人爱| 欧美中文字幕精品| 精品久久久久久中文字幕| 97人人做人人爱| 国外视频精品毛片| 伊人精品在线观看| 日本精品一区二区三区在线播放视频| 精品精品国产国产自在线| 亚洲91精品在线| 操91在线视频| 亚洲精品国产免费| 久久久国产一区| 国产v综合ⅴ日韩v欧美大片| 亚洲理论在线a中文字幕| 中文字幕日韩精品有码视频| 久色乳综合思思在线视频| 久久精品色欧美aⅴ一区二区| 最近2019中文字幕大全第二页| 亚洲精品视频免费| 亚洲欧美日韩一区二区在线| 国产一区二区三区18| 久久久免费电影| 粗暴蹂躏中文一区二区三区| 久久久电影免费观看完整版| 97视频人免费观看|