经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » jQuery » 查看文章
Node中的Cookie和Session
来源:cnblogs  作者:牛龙飞  时间:2019/8/27 9:51:52  对本文有异议

1、Cookie

HTTP是无状态协议。例:打开一个域名的首页,进而打开该域名的其他页面,服务器无法识别访问者。即同一浏览器访问同一网站,每次访问都没有任何关系。

Cookie的原理是:客户端浏览器在第一次访问服务器后,服务器返回一段json数据进行标识,此后当客户端浏览器再次访问同一个域时,每次都携带此cookie信息。

特点

  • cookie是不加密的,用户可以自由看到;
  • 用户可以删除cookie,或者禁用它,未设置失效时间,则默认关闭浏览器后失效
  • cookie可以被篡改
  • cookie可以用于攻击
  • cookie存储量很小。(小于4k)

Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

cookie在Node.js中使用:

  1. 1 const cookieParser = require('cookie-parser'); //模块 cookie-parser
  2. 2 const app = express();
  3. 3 app.use(cookieParser()); //中间件
  4. 4 app.get('/',(req,res)=>{
  5. 5 res.send('根路由');
  6. 6 })
  7. 7 app.get('/login',(req,res)=>{
  8. 8 //获取客户端cookies
  9. 9 console.log(req.cookies);
  10. 10
  11. 11 //服务器下发cookie
  12. 12 res.cookie('heaven','666',{
  13. 13 maxAge:900000 //有效时间,毫秒
  14. 14 });
  15. 15 res.send('ok');
  16. 16 })
  17. 17
  18. 18 app.listen(3000);

2、Session

服务器需要记录用户的状态,依赖cookie跟踪session,第一次创建session时,服务端会在HTTP协议中告诉客户端,需要在cookie里面记录一个session ID,以后客户端每次请求携带此session ID,服务器就能识别客户端。

特点

  • Session不是一个天生就有的技术,而是依赖cookie。当一个浏览器禁用cookie的时候,登录效果消失;或者用户清除了这个cookie,登录也消失;
  • session比cookie不一样在哪里呢?session下发的是乱码,并且服务器自己缓存一些东西;下次浏览器带着乱码上来,此时与缓存进行比较,看看是谁?
session在Node.js中使用
  1. /*
  2. session 数据存放在服务端,但索引存放在浏览器,浏览器是根据cookieid识别对应的session
  3. npm i express-session -S 使用session模块
  4. */
  5. const express = require('express');
  6. const session = require('express-session'); // 解析session的模块 express-session
  7. const app = express();
  8. //启动session的中间件,公式
  9. app.use(session({ //要求客户端设置一个加密的cookie
  10. secret:'heaven', //任意字符都行,给cookie加密
  11. cookie:{maxAge:300000},
  12. resave:true,
  13. saveUninitialized:true,
  14. }))
  15. //中间件是按先后顺序执行的,所以放在前面拦截
  16. app.get('/favicon.ico',(req,res)=>{
  17. return;
  18. })
  19. app.get('/',(req,res)=>{
  20. res.send('你的足迹是'+req.session.lvyou);
  21. })
  22. app.get('/:city',(req,res)=>{
  23. let city = req.params.city;
  24. // console.log(req.session);
  25. let cityArr = req.session.lvyou || [];
  26. cityArr.push(city);
  27. req.session.lvyou = cityArr;
  28. res.send("你今天去了"+city);
  29. })
  30. app.listen(3000);
  1. /*
  2. 将session从内存中提取到mongo数据库内
  3. npm i connect-mongo -S 将session存入mongo数据库的模块
  4. */
  5. const express = require("express"),
  6. app = express(),
  7. session = require("express-session"),
  8. Mongosession = require("connect-mongo")(session),
  9. mongoose = require("mongoose");
  10. //连接数据库
  11. mongoose.connect("mongodb://localhost/bounty",{useNewUrlParser: true})
  12. //session公式
  13. app.use(session({
  14. secret:"doukeyi", //秘钥,加密
  15. rolling:true, //每次交互(操作页面,a标签,ajax)重新设定时间
  16. cookie:{maxAge:1000*60*60}, //cookie有效期 1小时
  17. resave:false, //是否每次请求都重新保存数据
  18. saveUninitialized:false, //是否默认设置初始值
  19. store:new Mongosession({
  20. url:"mongodb://localhost/bounty" //session存入数据库,到期后自动清除数据库
  21. })
  22. }))
  23. /*
  24. 清除session
  25. */
  26. router.get("/logout",function (req,res) {
  27. req.session.destroy();
  28. res.redirect("/login");
  29. })

3、区别

  • cookie是明码;session是乱码;
  • cookie存在客户端浏览器; session存在服务器;
  • cookie内存小;session内存大;

原文链接:http://www.cnblogs.com/danew/p/11415672.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号