Node.js知识 — HTTP 请求与响应如何设置 Cookie 信息

网络 通信技术
HTTP Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,浏览器下次向同一服务器发起请求时会携带该 cookie 信息到服务器。

[[398674]]

HTTP Cookie[1] 是服务器发送到用户浏览器并保存在本地的一小块数据,浏览器下次向同一服务器发起请求时会携带该 cookie 信息到服务器。

本文来自 “Nodejs技术栈” 一位读者的一个问题,“Node.js 发起 HTTP 请求时,怎么携带上 cookie 信息?”

通常我们在浏览器向服务器发起一个请求,浏览器会检查是否有相应的 Cookie(浏览器的安装目录下有个 cookie 文件夹用来存放各个域下设置的 cookie 信息),如有则自动添加到 Request headers 的 cookie 字段中发送到服务器。

这是浏览器的行为会自动帮我们做,那么如果一个 Node.js 做为客户端呢?

根据 RFC 6265[2] 定义的 cookie 工作方式,在 HTTP 请求处理中,服务端可以在 Response headers 中为客户端设置 Set-Cookie 字段。另外,客户端在 HTTP 请求的 Request headers 中以字段 Cookie 的形式将 cookie 信息传递给服务端。

下面我们用 Node.js 提供的系统模块 HTTP[3] 看看如何实现。

这是客户端的请求方法实现,我们可以在 headers 中直接设置 Cookie 字段,也可通过 http.request 返回的 req 对象调用 setHeader() 方法设置。

  1. const http = require('http'); 
  2. function sendRequest() { 
  3.   const req = http.request({ 
  4.     method: 'GET'
  5.     host: '127.0.0.1'
  6.     port: 3010, 
  7.     path: '/api'
  8.     headers: { 
  9.       Cookie: ['a=111''b=222'] // 方式一设置 
  10.     } 
  11.   }, res => { 
  12.     let data = ''
  13.     res.on('data', chunk => data += chunk.toString()); 
  14.     res.on('end', () => { 
  15.       console.log('response body: ', data); 
  16.       console.log('response cookie: ', res.headers['set-cookie']); 
  17.     }); 
  18.   }); 
  19.   req.setHeader('Cookie', ['b=222''c=333']) // 方式二设置 
  20.   req.on('error', console.error); 
  21.   req.end(); 
  22. sendRequest(); 

服务端代码如下所示,注意响应设置的是 Set-Cookie 字段。

  1. const http = require('http'); 
  2.  
  3. http.createServer((req, res) => { 
  4.   if (req.url === '/api') { 
  5.     console.log('received cookie data: ', req.headers.cookie); 
  6.     res.setHeader('Set-Cookie', ['c=333''d=444']) 
  7.     res.end('Cookie set success!'); 
  8.   } else { 
  9.     res.end('ok!'); 
  10.   } 
  11. }).listen(3010); 

同样的当你使用 request、node-fetch 等这些 HTTP 的请求库,其使用是相通的。

参考资料

[1]HTTP Cookie: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies

[2]RFC 6265: https://tools.ietf.org/html/rfc6265

[3]HTTP: https://nodejs.org/dist/latest-v14.x/docs/api/http.html

本文转载自微信公众号「Nodejs技术栈」,可以通过以下二维码关注。转载本文请联系Nodejs技术栈公众号。

 

责任编辑:武晓燕 来源: Nodejs技术栈
相关推荐

2021-03-09 08:03:21

Node.js 线程JavaScript

2021-10-21 08:59:17

技术HTTP攻击

2023-10-04 07:35:03

2011-09-09 14:23:13

Node.js

2017-08-17 13:56:30

JavascriptNode.jsHttp

2024-03-18 10:15:00

HTTPNode.jsAPI

2023-06-30 23:25:46

HTTP模块内存

2014-09-12 10:35:09

Node.jsHTTP 206

2022-10-28 15:51:24

JavaScript开发Node.js

2013-11-01 09:34:56

Node.js技术

2015-03-10 10:59:18

Node.js开发指南基础介绍

2021-10-03 15:02:50

HTTPNodejs

2017-04-24 08:31:26

Node.jsExpress.jsHTTP

2021-05-21 09:36:42

开发技能代码

2022-09-04 15:54:10

Node.jsAPI技巧

2021-05-27 09:00:00

Node.js开发线程

2021-07-30 11:20:53

JavaScriptNode.jsWeb Develop

2022-08-22 07:26:32

Node.js微服务架构

2011-09-08 13:46:14

node.js

2011-11-01 10:30:36

Node.js
点赞
收藏

51CTO技术栈公众号