1、Cookie
- 创建 Cookie
1 2 3
| Set-Cookie: <cookie 名>=<cookie 值> //例 response.setHeader("Set-Cookie", `session_id=${random};HttpOnly`);
|
2、Session
session 数据放在服务器上,一般由 cookie 保存 session 的 id,保存在 Cookie 里的 session id 是独一无二的随机生成的,服务器通过 Cookie 保存的 session id 获取数据
3、两者区别
存储位置:cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
安全性:cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行篡改
限制:单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。
简单实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| if (path === "/sign_in" && method === "POST") { const array = []; const users = JSON.parse(fs.readFileSync("./db/users.json").toString()); response.setHeader("Content-Type", "text/html,charset=UTF-8"); request.on("data", (chunk) => { array.push(chunk); }); request.on("end", () => { const string = Buffer.concat(array).toString(); const obj = JSON.parse(string); const user = users.find( (user) => user.name === obj.name && user.password === obj.password ); if (user === undefined) { response.statusCode = 400; response.setHeader("Content-Type", "text/json;charset=utf-8"); response.end(); } else { response.statusCode = 200; const random = Math.random(); session[random] = { user_id: user.id }; fs.writeFileSync("./session.json", JSON.stringify(session)); response.setHeader("Set-Cookie", `session_id=${random};HttpOnly`); response.end(); } }); } else if (path === "/home.html") { const cookie = request.headers["cookie"]; let sessionId;
try { sessionId = cookie .split(";") .filter((s) => s.indexOf("session_id=") >= 0)[0] .split("=")[1]; console.log(sessionId); } catch (error) {} if (sessionId && session[sessionId]) { const userId = session[sessionId].user_id; console.log(userId); const homeHtml = fs.readFileSync("./public/home.html").toString(); const users = JSON.parse(fs.readFileSync("./db/users.json").toString()); const user = users.find((user) => user.id === userId); let string; if (user) { string = homeHtml .replace("{{loginStatus}}", "已登录") .replace("{{userName}}", user.name); } else { string = homeHtml .replace("{{loginStatus}}", "未登录") .replace("{{userName}}", ""); } response.write(string); response.end(); } else { const homeHtml = fs.readFileSync("./public/home.html").toString(); const string = homeHtml .replace("{{loginStatus}}", "未登录") .replace("{{userName}}", ""); response.write(string); } }
|
Cookie V.S. LocalStorage V.S. SessionStorage V.S. Session
LocalStorage V.S. SessionStorage
LocalStorage 一般不会自动过期(除非用户手动清除),而 SessionStorage 在回话结束时过期(如关闭浏览器)
Cookie V.S. Session
Cookie 存在浏览器的文件里,Session 存在服务器的文件里
Session 是基于 Cookie 实现的,具体做法就是把 SessionID 存在 Cookie 里