HTTP协议特性之Cookie(2)服务端Cookie——NodeJs版
一、基本介绍
1、Set-Cookie:响应首部字段
服务端可以使用Set-Cookie首部为客户端种入Cookie。
"Set-Cookie":"id=123"
"Set-Cookie":["id=123","name=zd","age=18"]
代码解释
2、Cookie:请求首部字段
当客户端接入Cookie后,在每次新请求时客户端会自动携带Cookie
二、Cookie快速入门案列
1、步骤一:开启NodeJs服务端测试HTTP连接
NodeJs服务端代码如下:
const http = require("http");
const fs = require("fs");
const host = "127.0.0.1";
const port = 8080;
const server = http.createServer((requestMsg, response) => {
if (requestMsg.url === "/") {
fs.readFile("../html/cookie.html",(err,data)=>{
if(!err){
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html"
})
response.end(data);
}else {
response.writeHead(404," NOT Find File",{
"Content-Type":"text/html"
})
response.end(`<b>404 NOT Find File</b>`);
}
})
} else {
response.end();
}
})
server.listen(port, host, () => {
console.log(`server starting at ${host}:${port}`)
})
代码解释
2、步骤二:设置NodeJs服务端Cookie
修改代码:
response.writeHead(200,"OK",{
"Content-Type":"text/html"
})
代码解释
为:
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":[`id=123`,`name=zd`,`age=18`]
})
代码解释
完整代码如下:
const http = require("http");
const fs = require("fs");
const host = "127.0.0.1";
const port = 8080;
const server = http.createServer((requestMsg, response) => {
if (requestMsg.url === "/") {
fs.readFile("../html/cookie.html",(err,data)=>{
if(!err){
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":[`id=123`,`name=zd`,`age=18`]
})
response.end(data);
}else {
response.writeHead(404," NOT Find File",{
"Content-Type":"text/html"
})
response.end(`<b>404 NOT Find File</b>`);
}
})
} else {
response.writeHead(500, "Invalid Request", {"Content-Type": "text/html; charset=utf-8"});
response.end("无效请求");
}
})
server.listen(port, host, () => {
console.log(`server starting at ${host}:${port}`)
})
代码解释
3、浏览器Cookie示意图如下:

三、Cookie时效
1、基本介绍
通常情况下,默认设置下 Cookie 采用 session 级别存储
max-age 属性
该属性允许控制 cookie 的有效存活时间(以秒为单位)
2、代码示例:
修改代码:
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":[`id=123`,`name=zd`,`age=18`]
})
代码解释
为:
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":[`id=123`,`name=zd`,"age=18;max-age=5"]
})
代码解释
3、代码说明:
age字段在Cookie中只保存5秒,之后会消失。

四、Cookie作用域——HttpOnly
1、基本介绍:
HTTP Only标记:
防止跨域脚本(XSS)攻击;利用JavaScript的 Document.cookie API不具备访问带有HTTP Only配置的信息的能力。
配置为HTTP Only的信息字段中,客户端不具备读取数据的能力。
2、代码示例:
修改代码:
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":[`id=123`,`name=zd`,"age=18;max-age=5"]
})
代码解释
为:
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":[`id=123`,`name=zd;HttpOnly`,"age=18;max-age=5"]
})
代码解释
3、代码说明:
客户端获取Cookie代码:
//客户端访问cookie
console.log(document.cookie)
代码解释
在浏览器log中无法获取name字段及其内容。
五、Cookie域名绑定
Cookie是绑定域名的,不同域名之间的Cookie不同
const http = require("http");
const fs = require("fs");
const host = "127.0.0.1";
const port = 8080;
// Cookie是绑定域名的,不同域名之间的Cookie不同
const server = http.createServer((requestMsg, response) => {
if (requestMsg.url === "/") {
fs.readFile("../html/cookie.html",(err,data)=>{
if(!err){
if(requestMsg.headers["host"]==="test.com:8080"){
response.writeHead(200,"ok",{
"Content-Type":"text/html",
"Set-Cookie":"test.com=123123212"
})
}
if(requestMsg.headers["host"]==="b.test.com:8080"){
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":"b.test.com=bbbbbbbbbbbbb"
})
}
if(requestMsg.headers["host"]==="a.test.com:8080"){
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":"a.test.com=aaaaaaaaaaaaaaaa"
})
}
response.end(data);
}else {
response.writeHead(404," NOT Find File",{
"Content-Type":"text/html"
})
response.end(`<b>404 NOT Find File</b>`);
}
})
} else {
response.writeHead(500, "Invalid Request", {"Content-Type": "text/html; charset=utf-8"});
response.end("无效请求");
}
})
server.listen(port, host, () => {
console.log(`server starting at ${host}:${port}`)
})
代码解释
六、Cookie作用域——Domain实现跨域名Cookie
由此可见,在大多数情况下,“每个Website都会被单独管理”,即每个Website都有自己的 cookie 系统。“同一Website的不同子域对应的 cookie 是独立存在的”,因此在这种情况之下,“那么如何让各个子域都能使用相同的 cookie?”这个问题就显得尤为重要了。“因此,在这种情况下”,我们需要了解的是,“如何能让各个子域都能访问到同一个 cookie 系统。”“由于每个 Website 只允许其父 Website 权限访问其 child Websites 的 cookie 系统”,所以对于 test.com 来说,默认情况下,“所有的 child Websites 都可以在 test.com 和 sub.test.com 上使用同样的 cookies”。
1、基本介绍
Domain
Domain 用于标识可接收Cookie的主机列表。如果不设置Default域名,默认情况下仅包括当前文档及其子域名。
如果设置了Default域名,则该域通常会包含其所有子域名。
2、如何更改域名?
域名文件一般位于C:\Windows\System32\drivers\etc目录下的hosts文件中。
一般会选择直接修改hosts文件;然而我们通常会选择使用Chrome插件HostAdmin-App。
3、HostAdmin-App使用介绍
步骤一:安装HostAdmin-App,成功后界面如下:

步骤二:配置hostAdmin权限
以管理员身份运行cmd,如下命名:
cacls %windir%/system32/drivers/etc/hosts /E /G Users:W
代码解释
修改域名访问权限。
步骤三:修改文件使用

4、代码示例:
const http = require("http");
const fs = require("fs");
const host = "127.0.0.1";
const port = 8080;
// Cookie是绑定域名的,不同域名之间的Cookie不同
//跨域名Cookie:只能父域名分享给子域名
const server = http.createServer((requestMsg, response) => {
if (requestMsg.url === "/") {
fs.readFile("../html/cookie.html",(err,data)=>{
if(!err){
if(requestMsg.headers["host"]==="test.com:8080"){
// domain设置Cookie权限,表示test.com域名在其本身域名和子域名都有效
response.writeHead(200,"ok",{
"Content-Type":"text/html",
"Set-Cookie":"test.com=123123212;domain=test.com"
})
}
if(requestMsg.headers["host"]==="b.test.com:8080"){
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":"b.test.com=bbbbbbbbbbbbb"
})
}
if(requestMsg.headers["host"]==="a.test.com:8080"){
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":"a.test.com=aaaaaaaaaaaaaaaa;domain=a.test.com"
})
}
response.end(data);
}else {
response.writeHead(404," NOT Find File",{
"Content-Type":"text/html"
})
response.end(`<b>404 NOT Find File</b>`);
}
})
} else {
response.writeHead(500, "Invalid Request", {"Content-Type": "text/html; charset=utf-8"});
response.end("无效请求");
}
})
server.listen(port, host, () => {
console.log(`server starting at ${host}:${port}`)
})
代码解释
七、Cookie作用域——Path指定主机路径
1、基本介绍
Path
Path 明确哪些主机下的路径可以接受Cookie
例如,在配置 Path=/docs后,则以下地址将被匹配:
/docs
/docs/Web/
/docs/Web/HTTP
代码解释
2、代码示例:
const http = require("http");
const fs = require("fs");
const host = "127.0.0.1";
const port = 8080;
// Cookie是绑定域名的,不同域名之间的Cookie不同
//跨域名Cookie:只能父域名分享给子域名
const server = http.createServer((requestMsg, response) => {
if (requestMsg.url === "/") {
fs.readFile("../html/cookie.html",(err,data)=>{
if(!err){
if(requestMsg.headers["host"]==="test.com:8080"){
// domain设置Cookie权限,表示test.com域名在其本身域名和子域名都有效
//cooki未配置path时,在当前域名下/和其子目录都有效,如果配置path=/a,只有/a和/a/.../(子目录)有效
response.writeHead(200,"ok",{
"Content-Type":"text/html",
"Set-Cookie":"test.com=123123212;domain=test.com;path=/a"
})
}
if(requestMsg.headers["host"]==="b.test.com:8080"){
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":"b.test.com=bbbbbbbbbbbbb"
})
}
if(requestMsg.headers["host"]==="a.test.com:8080"){
//设置响应返回html
response.writeHead(200,"OK",{
"Content-Type":"text/html",
"Set-Cookie":"a.test.com=aaaaaaaaaaaaaaaa;domain=a.test.com"
})
}
response.end(data);
}else {
response.writeHead(404," NOT Find File",{
"Content-Type":"text/html"
})
response.end(`<b>404 NOT Find File</b>`);
}
})
} else {
response.writeHead(500, "Invalid Request", {"Content-Type": "text/html; charset=utf-8"});
response.end("无效请求");
}
})
server.listen(port, host, () => {
console.log(`server starting at ${host}:${port}`)
})
代码解释
