Advertisement

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.comsub.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}`)
    })
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

全部评论 (0)

还没有任何评论哟~