在 Web 应用程序中,Cookie 和 Session 是维护用户状态的重要机制。Cookie 是一段文本信息,由服务器发送给客户端浏览器,存储在用户的计算机上,用于在用户访问同一网站时发送回服务器。Session 则是一种在服务器端维护的数据结构,用于存储用户登录信息、购物车内容等状态信息。在 Node.js 中,处理 Cookie 和 Session 非常简单,本文将详细介绍如何正确处理 Cookie 和 Session。
Cookie
发送 Cookie 到客户端
在 Node.js 中,使用 http
模块的 response
对象来发送 Cookie:
response.setHeader('Set-Cookie', ['name=value; expires=...; path=...', 'name=value; expires=...; path=...']);
其中,第一个参数为 Set-Cookie
,第二个参数为一个数组,用于指定多个 Cookie。每个 Cookie 都是一个字符串,格式如下:
name=value; expires=...; path=...
其中,name
为 Cookie 名称,value
为 Cookie 值,expires
为过期时间,path
为 Cookie 路径。例如:
response.setHeader('Set-Cookie', 'name=value; expires=' + new Date(new Date().getTime() + 60 * 60 * 1000).toUTCString() + '; path=/');
上面代码中,将一个名为 name
的 Cookie 发送给客户端,设定其值为 value
,过期时间为当前时间一小时后,路径为根目录。
读取客户端发送的 Cookie
在 Node.js 中,使用 http
模块的 request
对象来读取客户端发送的 Cookie:
request.headers.cookie
读取的结果是一个字符串,多个 Cookie 之间用分号和空格(;
)分隔。例如:
name1=value1; name2=value2
可选属性
除了 name
、value
、expires
、path
,Cookie 还支持以下可选属性:
domain
:指定 Cookie 可用的域名,默认为当前域名;secure
:指定只有通过 HTTPS 协议传输的 Cookie 才会发送到服务器;HttpOnly
:指定只有通过 HTTP 或 HTTPS 协议传输的 Cookie 才会发送到服务器,不能通过 JavaScript 脚本访问,可以有效防止跨站脚本攻击(XSS)。
示例代码:
response.setHeader('Set-Cookie', 'name=value; expires=' + new Date(new Date().getTime() + 60 * 60 * 1000).toUTCString() + '; path=/; domain=example.com; secure; HttpOnly');
Session
发送 Session 到客户端
在 Node.js 中,通常使用第三方库来处理 Session,例如 express-session
。安装 express-session
:
npm install express-session --save
然后,在应用程序中使用 express-session
:
-- -------------------- ---- ------- ----- ------- - --------------------------- ----- --- - ---------- ----------------- ------- --------- ----- -- ---- ------- -- --- ------- ------ -- ----------- ------- ------------------ ------ -- --------- ------- ------- - ------- ------ ------- -- - -- - ----- --------- ---- -- -- ------ -- ----
上面代码中,secret
用于加密 Session ID,resave
和 saveUninitialized
用于控制 Session 的保存行为,cookie
用于设置Cookie。其中,secure
和 httpOnly
分别对应 Cookie 的 secure
和 HttpOnly
属性,maxAge
指定 Cookie 的过期时间。
在应用程序中,可以使用 req.session
访问 Session:
app.get('/', (req, res) => { if (req.session.views) { req.session.views++; } else { req.session.views = 1; } res.send(`You have visited this page ${req.session.views} times`); });
上面代码中,req.session
是一个对象,表示该用户的 Session。如果 req.session.views
存在,则访问次数加一,否则访问次数为 1。
读取客户端发送的 Session ID
在 Node.js 中,Session ID 默认被保存在 Cookie 中。读取客户端发送的 Session ID,只需要读取客户端发送的 Cookie,找到名为 connect.sid
的 Cookie 值即可。
示例代码:
-- -------------------- ---- ------- ----- ------- - ------------------------------------ ----- --- - ----------------------- -------- ------------------- - ----- ------- - --- -- --------- - ------ -------- - -------------------------------- -- - ----- ----- ------ - ----------------------- ------------ - -------------------------- --- ------ -------- -
上面代码中,使用 parseCookie
函数解析客户端发送的 Cookie,sid
即为 Session ID。
总结
本文详细介绍了如何在 Node.js 中正确处理 Cookie 和 Session。对于 Cookie,可以通过发送和读取 Cookie,来存储和获取用户状态;对于 Session,可以使用 express-session
第三方库,在应用程序中方便地处理 Session。需要注意的是,Cookie 和 Session 都有安全性问题,需要仔细设置相关属性来保护用户隐私和防止攻击。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ddc3acf6b2d6eab39017c0