이 글의 내용은 노드에서 세션이 무엇인지에 관한 것입니다. 사용하는 방법? 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
이전 글에서는 노드의 쿠키에 대해 소개했습니다. 이번 글에서는 계속해서 세션에 대해 설명하겠습니다.
세션은 세션일 뿐인데 세션이란 무엇인가요?
세션은 연결보다 더 세분화된 개념입니다. 세션
에는 여러 연결
이 포함될 수 있으며 각 연결은 세션의 작업으로 간주됩니다. 会话
可能包含多次连接
,每次连接都被认为是会话的一次操作。
当用户在Web页面之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
当用户请求来自应用程序的 Web 页面时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
说了这么多,我们先来看看这货吧。
原来session中间件生成的session是一个对象,里面包含了cookie信息。
首先,安装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连接对应的是同一个会话。
默认情况下,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数据库中,运行后,刷新浏览器,数据库中的信息如下:
首先,得安装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对象
사용자가 웹 페이지 사이를 이동할 때 세션 개체에 저장된 변수는 손실되지 않지만 사용자 세션 전체에서 유지됩니다.
사용자가 애플리케이션에서 웹 페이지를 요청할 때 사용자에게 아직 세션이 없으면 웹 서버는 자동으로 세션 개체를 생성합니다. 세션이 만료되거나 중단되면 서버는 세션을 종료합니다.
말을 너무 많이 했으니 먼저 이 제품부터 살펴보겠습니다.
세션 미들웨어에 의해 생성된 세션은 쿠키 정보를 담고 있는 객체인 것으로 밝혀졌습니다.
session in node
먼저 Express 프레임워크, cookieParser 미들웨어, express-session 미들웨어를 설치합니다rrreee기본적으로 Express 세션 미들웨어는 세션 정보를 메모리에 저장하며 쿠키
로 서명해야 하므로 cookieParser()를 사용할 때 비밀 키
를 전달해야 합니다. 비밀 키가 없으면 오류: 세션에 비밀 옵션이 필요합니다
라는 메시지가 표시됩니다.
페이지 조회수 계산
을 구현합니다. > 기능. 🎜위 코드를 실행하면 브라우저를 열고 페이지를 계속 새로 고치며 노드 프로그램에 인쇄된 sess 값을 관찰할 수 있습니다. 🎜동일한 브라우저에서 페이지를 새로고침하면 동일한 세션이 콘솔에 출력되지만 뷰 값이 변경되는 것을 발견했습니다. 즉, 여러 http 연결이 동일한 세션에 해당합니다. 🎜🎜세션은 redis에 저장됩니다🎜🎜기본적으로 Express 세션 미들웨어는 세션 정보를 메모리에 저장하지만 개발 및 생산 중에는 세션 데이터를 저장하기 위해 지속적이고 확장 가능한 데이터를 보유하는 것이 가장 좋습니다. Express 커뮤니티는 MongoDB, Redis, Memcached, PostgreSQL 등을 포함하여 데이터베이스를 사용하는 여러 세션 저장소를 만들었습니다. 그러나 지연 시간이 짧은 키/값 저장
은 이러한 종류의 휘발성 데이터에 가장 적합합니다. 여기서는 먼저 redis를 사용하여 세션 정보를 저장합니다. 🎜🎜먼저 connect-redis 모듈을 설치합니다. 🎜rrreee🎜코드는 다음과 같습니다. 🎜rrreee🎜위 프로그램에서 세션 정보는 redis의 db1 데이터베이스에 저장됩니다. 실행 후 브라우저를 새로 고치고 해당 정보를 새로 고칩니다. 데이터베이스는 다음과 같습니다: 🎜 🎜🎜세션은 mongoDB에 저장됩니다🎜 🎜. 아래: eRrreee🎜 실행 후 새로고침하세요. 브라우저 페이지에서 다음 세션 정보가 decodb 데이터베이스의 세션 컬렉션에 저장되어 있음을 확인합니다. 🎜🎜🎜🎜어떤 사람들은 이렇게 물을 수도 있습니다. 결과는 보이는데 그 과정에서 무슨 일이 일어났나요? 🎜실제로 브라우저가 첫 번째 요청을 시작하면 세션 미들웨어는 (쿠키 정보가 포함된) 세션 개체
를 생성합니다. 동시에 이 세션 개체는 mongoDb 데이터베이스에 저장됩니다. 요청이 반환되면 브라우저 클라이언트는 자동으로 이 세션 개체에 쿠키를 저장합니다. 브라우저는 세션 개체가 아닌 쿠키를 저장합니다. 🎜이 쿠키에는 만료 시간이 있습니다. 예를 들어 위 코드에 설정된 쿠키는 8시간입니다. 즉, 이 쿠키는 8시간 후에 브라우저에서 자동으로 사라집니다. 🎜🎜관련 권장 사항: 🎜🎜🎜세션이란 무엇입니까🎜🎜🎜🎜🎜노드의 Express에서 소켓.io_node.js를 사용하는 방법🎜🎜
위 내용은 노드의 세션이란 무엇입니까? 사용하는 방법?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!