node中session是什么?如何用?
本篇文章给大家带来的内容是关于node中session是什么?如何用?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
前言
在上一篇中node中的cookie,对cookie进行了相关介绍,本篇将继续前行,对session进行说明。
session是什么
session不就是会话嘛,那什么是会话呢?
会话是一个比连接粒度更大的概念,一次会话
可能包含多次连接
,每次连接都被认为是会话的一次操作。
当用户在Web页面之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
当用户请求来自应用程序的 Web 页面时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
说了这么多,我们先来看看这货吧。
原来session中间件生成的session是一个对象,里面包含了cookie信息。
node中的session
首先,安装express框架,cookieParser中间件,express-session中间件
npm i express --save npm i cookie-parser --save npm i express-session --save
默认情况下,Express会话中间件是把session信息存储在内存中,且需要用签名cookie
,所以在使cookieParser()时得给它传给一个秘钥
。如果没有秘钥,则会提醒 Error: secret option required for sessions
代码如下:
var express = require('express'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var app = express() app.use(cookieParser()) const hour = 1000 * 60 * 60; var sessionOpts = { // 设置密钥 secret: 'a cool secret', // Forces the session to be saved back to the session store resave: true, // Forces a session that is "uninitialized" to be saved to the store. saveUninitialized: true, // 设置会话cookie名, 默认是connect.sid key: 'myapp_sid', // If secure is set to true, and you access your site over HTTP, the cookie will not be set. cookie: { maxAge: hour * 2, secure: false } } app.use(session(sessionOpts)) app.use(function(req, res, next) { if (req.url === '/favicon.ico') { return } // 同一个浏览器而言,req是同一个 var sess = req.session; console.log(sess) if (sess.views) { sess.views++; } else { sess.views = 1; } res.setHeader('Content-Type', 'text/html'); res.write('<p>views: ' + sess.views + '</p>'); res.end(); }); app.listen(4000);
上面代码实现了一个简单的页面浏览计数
功能。
运行上面代码,可以打开浏览器,不断刷新页面,观察node程序中打印的sess值。
我们发现,在同一个浏览器中刷新页面,控制台上打印的是同一个session,只不过其中的views的值变了,也就是说,多次http连接对应的是同一个会话。
session存入redis
默认情况下,Express会话中间件是把session信息存储在内存中,但在开发和生产期间,最好有一个持久化的、可扩展的数据存放你的会话数据。express社区已经创建了几个使用数据库的会话存储,包括MongoDB、Redis、Memcached、PostgreSQL以及其他数据库。但低延迟的键/值存储
最适合这种易失性数据,这里我们先用redis来存储session信息。
首先,安装connect-redis模块
npm i connect-redis --save
代码如下:
var express = require('express'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var RedisStore = require('connect-redis')(session); var app = express() app.use(cookieParser()) var options = { host: '127.0.0.1', port: 6379, db: 1, // Database index to use. Defaults to Redis's default (0). prefix: 'ID:' // Key prefix defaulting to "sess:" // pass: 'aaa' // Password for Redis authentication } const hour = 1000 * 60 * 60; var sessionOpts = { store: new RedisStore(options), // 设置密钥 secret: 'a cool secret', // Forces the session to be saved back to the session store resave: true, // Forces a session that is "uninitialized" to be saved to the store. saveUninitialized: true, // 设置会话cookie名 key: 'myapp_sid', // If secure is set to true, and you access your site over HTTP, the cookie will not be set. cookie: { maxAge: hour * 8, secure: false } } app.use(session(sessionOpts)) // 如果没有secret,会提醒 Error: secret option required for sessions app.use(function(req, res, next) { if (req.url === '/favicon.ico') { return } var sess = req.session; var id = req.sessionID; // session ID, 只读 console.log(sess, id); if (sess.views) { sess.views++; // 如果放在res.end()后,不会自增 res.setHeader('Content-Type', 'text/html'); res.write('<p>views: ' + sess.views + '</p>'); res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>'); res.end(); } else { sess.views = 1; res.end('welcome to the session demo. refresh!'); } }); app.listen(4000);
上面程序中,将会话信息存入了redis的db1数据库中,运行后,刷新浏览器,数据库中的信息如下:
session存入mongoDb
首先,得安装connect-mongo模块
npm i connect-mongo --save
代码如下:
var express = require('express'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var MongoStore = require('connect-mongo')(session); const hour = 1000 * 60 * 60 var app = express() app.use(cookieParser()) app.use(session({ secret: 'a cool secret', key: 'mongo_sid', cookie: { maxAge: hour * 8, secure: false }, resave: true, saveUninitialized: true, store: new MongoStore({ url: 'mongodb://@localhost:27017/demodb' }) })); app.use(function(req, res, next) { if (req.url === '/favicon.ico') { return } var sess = req.session; var id = req.sessionID; // session ID, 只读 console.log(sess, id); if (sess.views) { sess.views++; } else { sess.views = 1; } res.setHeader('Content-Type', 'text/html'); res.write('<p>views: ' + sess.views + '</p>'); res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>'); res.write('<p>httpOnly: ' + sess.cookie.httpOnly + '</p>'); res.write('<p>path: ' + sess.cookie.path + '</p>'); res.write('<p>secure: ' + sess.cookie.secure + '</p>'); res.end(); }); app.listen(4000);
运行后,刷新浏览器页面,在demodb数据库中的sessions集合中发现已经存入了如下session信息。
可能会有人问:结果是看到了,但这过程中到底发生了什么呢?
其实,当浏览器发起第一次请求时,session中间件会生成一个session对象
(其中包含cookie信息),这个session对象会存入mongoDb数据库中,同时,请求返回时,浏览器客户端会自动将这个session对象中的cookie保存起来,注意哦,浏览器存的可是cookie,而不是session对象。
这个cookie有一个过期时间,比如,上面代码中设置的是8小时。也就是说,8小时后,这个cookie在浏览器中会自动消失。
相关推荐:
如何在node的express中使用socket.io_node.js
Atas ialah kandungan terperinci node中session是什么?如何用?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Mulakan semula Redis dengan menyatakan fail konfigurasi: 1. Cari fail konfigurasi (redis.conf biasanya terletak di subdirektori conf); 2. Ubah suai konfigurasi yang diperlukan (seperti menukar port); 3. Gunakan perintah redis-server /path/to/redis.conf untuk memulakan semula redis melalui fail konfigurasi (di mana /path/to/redis.conf adalah laluan fail konfigurasi yang diubahsuai); 4. Gunakan Redis-CLI untuk mengesahkan bahawa ia telah berjaya dimulakan semula.

Memori Redis melonjak termasuk: jumlah data yang terlalu besar, pemilihan struktur data yang tidak betul, masalah konfigurasi (seperti tetapan MaxMemory terlalu kecil), dan kebocoran memori. Penyelesaian termasuk: penghapusan data yang telah tamat tempoh, menggunakan teknologi mampatan, memilih struktur yang sesuai, menyesuaikan parameter konfigurasi, memeriksa kebocoran memori dalam kod, dan kerap memantau penggunaan memori.

Pemecahan ingatan redis merujuk kepada kewujudan kawasan bebas kecil dalam ingatan yang diperuntukkan yang tidak dapat ditugaskan semula. Strategi mengatasi termasuk: Mulakan semula Redis: Kosongkan memori sepenuhnya, tetapi perkhidmatan mengganggu. Mengoptimumkan struktur data: Gunakan struktur yang lebih sesuai untuk Redis untuk mengurangkan bilangan peruntukan dan siaran memori. Laraskan parameter konfigurasi: Gunakan dasar untuk menghapuskan pasangan nilai kunci yang paling kurang baru-baru ini. Gunakan mekanisme kegigihan: sandarkan data secara teratur dan mulakan semula redis untuk membersihkan serpihan. Pantau penggunaan memori: Cari masalah tepat pada masanya dan ambil langkah.

Data masih wujud selepas Redis dimulakan semula. Redis menyimpan data dalam ingatan, dan memulakan semula tidak memadam data memori. REDIS juga menyediakan kegigihan, menyimpan data ke cakera keras melalui fail RDB atau AOF, memastikan data dapat dipulihkan dari fail yang berterusan selepas dimulakan semula.

Bagaimana untuk memulakan semula perkhidmatan REDIS dalam sistem pengendalian yang berbeza: Linux/macOS: Gunakan perintah SystemCTL (SistemCTL Restart Redis-Server) atau Perintah Perkhidmatan (Perkhidmatan Redis-Server Restart). Windows: Gunakan alat perkhidmatan.msc (masukkan "Services.msc" dalam kotak dialog Run dan tekan Enter) dan klik kanan perkhidmatan "Redis" dan pilih "mulakan semula".

Redis Kegigihan akan mengambil ingatan tambahan, RDB sementara meningkatkan penggunaan memori apabila menjana snapshot, dan AOF terus mengambil ingatan apabila memasuki log. Faktor yang mempengaruhi termasuk jumlah data, dasar kegigihan dan konfigurasi REDIS. Untuk mengurangkan kesan, anda boleh mengkonfigurasi dasar snapshot RDB, mengoptimumkan konfigurasi AOF, menaik taraf perkakasan dan memantau penggunaan memori. Selain itu, adalah penting untuk mencari keseimbangan antara prestasi dan keselamatan data.

Tetapan saiz memori Redis perlu mempertimbangkan faktor -faktor berikut: Jumlah data dan trend pertumbuhan: Anggarkan saiz dan kadar pertumbuhan data yang disimpan. Jenis Data: Jenis yang berbeza (seperti senarai, hash) menduduki memori yang berbeza. Dasar caching: cache penuh, cache separa, dan dasar pemisahan mempengaruhi penggunaan memori. Puncak Perniagaan: Tinggalkan memori yang cukup untuk menangani puncak lalu lintas.

Perintah Redis Restart adalah Redis-Server. Perintah ini digunakan untuk memuatkan fail konfigurasi, membuat struktur data, memulakan pelayan Redis, dan mendengar sambungan klien. Pengguna boleh melaksanakan perintah "Redis-Server [Options]" di terminal untuk memulakan semula pelayan Redis. Pilihan umum termasuk operasi latar belakang, menentukan laluan fail konfigurasi, menentukan port mendengar, dan memuatkan semula gambar hanya apabila data hilang. Perhatikan bahawa memulakan semula pelayan akan memutuskan semua sambungan klien, pastikan anda menyimpan data yang diperlukan sebelum dimulakan semula.
