Node中的Cookie和Session
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 const cookieParser = require('cookie-parser'); //模块 cookie-parser
2 const app = express();
3 app.use(cookieParser()); //中间件
4 app.get('/',(req,res)=>{
5 res.send('根路由');
6 })
7 app.get('/login',(req,res)=>{
8 //获取客户端cookies
9 console.log(req.cookies);
10
11 //服务器下发cookie
12 res.cookie('heaven','666',{
13 maxAge:900000 //有效时间,毫秒
14 });
15 res.send('ok');
16 })
17
18 app.listen(3000);
2、Session
服务器需要记录用户的状态,依赖cookie跟踪session,第一次创建session时,服务端会在HTTP协议中告诉客户端,需要在cookie里面记录一个session ID,以后客户端每次请求携带此session ID,服务器就能识别客户端。
特点
- Session不是一个天生就有的技术,而是依赖cookie。当一个浏览器禁用cookie的时候,登录效果消失;或者用户清除了这个cookie,登录也消失;
- session比cookie不一样在哪里呢?session下发的是乱码,并且服务器自己缓存一些东西;下次浏览器带着乱码上来,此时与缓存的乱码进行比较与识别。
/*
session 数据存放在服务端,但索引存放在浏览器,浏览器是根据cookieid识别对应的session
npm i express-session -S 使用session模块
*/
const express = require('express');
const session = require('express-session'); // 解析session的模块 express-session
const app = express(); //启动session的中间件,公式
app.use(session({ //要求客户端设置一个加密的cookie
secret:'heaven', //任意字符都行,给cookie加密
cookie:{maxAge:300000},
resave:true,
saveUninitialized:true,
}))
//中间件是按先后顺序执行的,所以放在前面拦截
app.get('/favicon.ico',(req,res)=>{
return;
}) app.get('/',(req,res)=>{
res.send('你的足迹是'+req.session.lvyou);
})
app.get('/:city',(req,res)=>{
let city = req.params.city;
// console.log(req.session);
let cityArr = req.session.lvyou || [];
cityArr.push(city);
req.session.lvyou = cityArr;
res.send("你今天去了"+city);
}) app.listen(3000);
/*
将session从内存中提取到mongo数据库内
npm i connect-mongo -S 将session存入mongo数据库的模块
*/
const express = require("express"),
app = express(),
session = require("express-session"),
Mongosession = require("connect-mongo")(session),
mongoose = require("mongoose");
//连接数据库
mongoose.connect("mongodb://localhost/bounty",{useNewUrlParser: true})
//session公式
app.use(session({
secret:"doukeyi", //秘钥,加密
rolling:true, //每次交互(操作页面,a标签,ajax)重新设定时间
cookie:{maxAge:1000*60*60}, //cookie有效期 1小时
resave:false, //是否每次请求都重新保存数据
saveUninitialized:false, //是否默认设置初始值
store:new Mongosession({
url:"mongodb://localhost/bounty" //session存入数据库,到期后自动清除数据库
})
}))
/*
清除session
*/
router.get("/logout",function (req,res) {
req.session.destroy();
res.redirect("/login");
})
3、区别
- cookie是明码;session是乱码;我们可以轻松访问cookie值但是我们无法轻松访问session会话值,因此后者更安全
- cookie存在客户端浏览器; session存在服务器;
- cookie内存小,只允许4KB;session内存大;
Node中的Cookie和Session的更多相关文章
- 第74节:Java中的Cookie和Session
第74节:第74节:Java中的Cookie和Session ServletContext: 什么是ServletContext,有什么用哦,怎么用呢? 启动服务器后,会给每个应用程序创建一个Serv ...
- Flask中使用cookie和session
Flask中使用cookie和session 设置cookie from flask import Flask,Response app = Flask(__name__) @app.route('/ ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- django系列7.2--django中的cookie和session基本操作,浏览器登陆验证的不同实现
django中的cookie和session(02)–操作 一.Django中的cookie操作 ctrl + shift + del 是谷歌浏览器中清除页面缓存和cookie的快捷键 1.设置coo ...
- IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token
本文引用了简书作者“骑小猪看流星”技术文章“Cookie.Session.Token那点事儿”的部分内容,感谢原作者. 1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动 ...
- Django---Django中使用COOKIE和SESSION
Django---Django中使用COOKIE和SESSION 一丶Cookie cookie的由来 # HTTP协议是无状态的. # 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请 ...
- node学习之cookie和session
c什么是cookie Cookie设计的初衷是 维持浏览器和服务端的状态.http是无状态的,服务端不能跟踪客户端的状态. 浏览器第一次向服务器发送请求,服务器会返回一个cookie给客户端浏览器,浏 ...
- node中的cookie
为什么需要cookie 我们知道http是无状态的协议,无状态是什么意思呢?我来举一个小例子来说明:比如小明在网上购物,他浏览了多个页面,购买了一些物品,这些请求在多次连接中完成,如果不借助额外的手段 ...
- Servlet中的cookie和session
保存数据的2中方式 Cookie Session Cookie 我们可以将一些信息保存到cookie中,cookie存放在对应的浏览器目录里面.每个站点可以保存20个cookie,最大长度不超过4k. ...
随机推荐
- BJSV-P-004无缝大屏显示
无缝大屏显示 北京太速科技有限公司在线客服:QQ:448468544 淘宝网站:orihard.taobao.com/?联系电话:15084122580 欢迎关注微信公众号 啊智能时代
- 微信小程序(1)--新建项目
这些天看了一下最近特别火的微信小程序,发现和vue大同小异. 新建项目 为方便初学者了解微信小程序的基本代码结构,在创建过程中,如果选择的本地文件夹是个空文件夹,开发者工具会提示,是否需要创建一个 q ...
- 《程序员的呐喊》:一个熟悉多种语言的老程序员对编程语言、开发流程、google的战略等的思考,比较有趣。 五星推荐
作者熟悉二三十种编程语言,写了20多年代码.本书是作者对编程语言.开发流程.google的战略等的思考.比较有趣. 前面部分是作者对编程语言的一些思考.作者鄙视C++, Java,面向对象.比较有趣的 ...
- 前端学习(三十九)移动端app(笔记)
移动端App 开发App的三种方式 Native App 原生 底层语言 java Android oc ...
- Kotlin 匿名内部类对象引用当前Activity的this用法
一,Kotlin中匿名内部类,引用Activity的this用法为 this@MainActivity (对应自己的Activity),还是上代码吧 class Main17Activity : Ap ...
- D3笔记01——D3简介与安装
1 D3简介 发布于2011年,全称Data-Driven Documents,直译为“数据驱动的文档”. 简单概括为一句话:D3是一个Javascript的函数库,是用来做数据可视化的.文档指DOM ...
- 简单使用vuex状态管理
1.在使用vue-cli脚手架创建项目后 npm install vuex 2.创建store文件夹,结构如下: 3.store中 index.js代码如下: 4.入口文件main.js中引入stor ...
- 前端开发工具-VsCode插件【个人开发常用】
前端开发工具-VsCode插件[个人开发常用] Atom One Dark Theme-主题 Chinese (Simplified) Language Pack for Visual Studio ...
- git操作命令行
前言 git操作各种软件五花八门,懒得研究,用最原始的方法敲命令行. 操作 1.网上下载git 网上百度一下好多直接下载就好 2.配置用户名邮箱 $ git config --global user. ...
- 报错——userdel: user hhh is currently used by process 9218
报错 userdel: user hhh is currently used by process 9218 [root@centos71 ~]# useradd hhh [root@centos71 ...