我的编程空间,编程开发者的网络收藏夹
学习永远不晚

全面了解cookie和session

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

全面了解cookie和session

  • http协议:

http即超文本传输协议(万维网定义的),一种基于浏览器请求与服务器响应的链接,它是一个很纯粹的传输协议。http协议主要的特征就是它是一种无状态的协议(只针对cookie与session问题),在客户端连续向服务器发送请求的时候,每次请求的过程中只要数据交换完毕,服务器与客户端就会断开连接,再次请求的时候会重新连接客户端与服务器,这样服务器记录上次的对话,那么问题来了,如何让服务器知道是哪个客户端向自己发出的请求呢,这个时候cookie就诞生了~

  • 什么是cookie

cookie是一小段文本信息,这段小文本信息由服务器首次响应客户端时发送的,在客户端向服务器首次发送请求的时候,服务器会判断是否要记录客户端的身份,如果需要,此时就会在响应中(response)给客户端发送一个cookie,该cookie文本信息保存在http的报头里,当浏览器会将cookie保存起来,当该浏览器再次发送请求时会携带cookie,服务器检查cookie来识别浏览器请求,这里cookie的特征就不在说明了。下面我们上代码!

页面代码:

复制代码
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <script type="text/javascript" class="lazy" data-src="jquery-3.3.1.min.js"></script>
    <script type="text/javascript" class="lazy" data-src='test.js'></script>
</head>
<body>
    <section>
        <h3>Register</h3>
        <div>
            <label style="display:inline-block; width: 100px;" id="register-user-name-label" htmlfor="register-user-name-input">register:</label>
            <input style="display:inline-block; width: 200px;" id="register-user-name-input" type="text" />
        </div>
        <div>
            <label style="display:inline-block; width: 100px;" id="register-password-label" htmlfor="register-password-input">pasword:</label>
            <input style="display:inline-block; width: 200px;" id="register-password-input" type="text" />
        </div>
        <button id="register" type="button">Register</button>
    </section>
    <section>
        <h3>Login</h3>
        <div>
            <label style="display:inline-block; width: 100px;" id="user-name-label" htmlfor="user-name-input">login name:</label>
            <input style="display:inline-block; width: 200px;" id="user-name-input" type="text" />
        </div>
        <div>
            <label style="display:inline-block; width: 100px;" id="password-label" htmlfor="password-input">pasword:</label>
            <input style="display:inline-block; width: 200px;" id="password-input" type="text" />
        </div>
        <button id="login" type="button">Login</button>
    </section>
    <script type="text/javascript" class="lazy" data-src='test.js'></script>
</body>
</html>
复制代码

很简单,一个注册按钮一个登陆按钮(ps:代码冗余请忽视,就是为了做个demo用)。

首先注册一个user:

注册user之后我们查看db

 

然后我们用这个user进行登陆操作,重点来啦~

首先刷新下页面,调用获取user方法,看下效果

代码如下:

复制代码
app.get('/userInfo', function (req, res) {
    //cookie
    if (req.cookies.userInfo) {
        console.log('login successfully')
    }
    else {
        console.log('session timeout.');
    }
    res.status(200).json(req.cookies.userInfo);
    //session
    // if (req.session.userInfo) console.log('login successfully');
    // else console.log('session timeout.');
})
复制代码

好了先mark下,回头再来做对比,下面执行login操作,这里要上代码了。

首先引入一个中间件:

var cookie = require('cookie-parser');

使用它:

复制代码
app.use(cookie('express_cookie'));
//cookie
app.post('/login', function (req, res) {
    User.findOne({
        username: req.body.username
    }).then(function (userInfo) {
        if (!userInfo) {
            console.log('user is not exist.');
            return;
        }
        var data = {};
        data['username'] = userInfo.username;
        data['password'] = userInfo.password;
        res.cookie('username', JSON.stringify(data), { maxAge: 900000, httpOnly: true });
        res.status(200).json(data);
    })
        .catch(function (e) {
            console.log(e);
        })
})
复制代码

这里我们可以设置cookie的httpOnly属性,最大生命周期,等等,然后我们先在db内查询当前登录user,如果已经注册过,我们获取user信息并存入cookie中。这时候看下前端的响应有什么不同。

 

 可以看见,服务器颁发的cookie在响应的header中的Set-Cookie中。似不似发现不同了。这时候我们在刷新下页面调用userInfo方法看下效果。

咦,我们发现这次的请求里面居然有cookie了,就这么神奇(Ps:我们要相信科学!)。

 debug下看看

服务器端有我们想要的cookie信息了。这样服务器就可以根据cookie知道了我们每一次的请求是不是同一个人了。

总结:首先cookie是服务器颁发的,然后随着响应返回给客户端也就是我们的浏览器,浏览器保存cookie,每一次发送请求都会带着这个cookie来让服务器知道,嗯我就是上次的那个人,到这里对cookie是不是多少了解了一些呢~

好了,那么现在很多浏览器都是禁用cookie的,原因是啥呢~,由于cookie是可以被获取的以及cookie是可以修改的,这时候引出了web安全方面的姿势,跨站脚本攻击以及跨站协议伪造,可以参考我之前写的关于XSS攻击(戳我:什么是XSS以及CFRS),那么如果cookie禁用了我们该怎么办呢?这时候session就诞生了。

  • 何为session:

session本省并不存在,只是一个概念,session是服务器用来记录客户端状态的机制,不同于cookie保存在浏览器中,session是保存在服务器上的,服务器会根据cookie生成一个session id存在服务器上,当请求再次抵达服务器时,服务器发出响应时会将session id 存在cookie内一同反回给浏览器,这就是session。session具体哪些特点这里就不写啦,话不多说,上代码。

首先引入一个中间件:

var session = require('express-session');

使用它

复制代码
app.use(cookie('express_cookie'));
app.use(session({
    secret: 'express_cookie',
    resave: false,
    saveUninitialized: true,
    cookie: { maxAge: 60 * 1000 * 30 },
    rolling: true,
}));

app.post('/login', function (req, res) {
    User.findOne({
        username: req.body.username
    }).then(function (userInfo) {
        if (!userInfo) {
            console.log('user is not exist.');
            return;
        }
        var data = {};
        data['username'] = userInfo.username;
        data['password'] = userInfo.password;
        req.session.userInfo = data;
        res.status(200).json(data);
    })
        .catch(function (e) {
            console.log(e);
        })
})
复制代码

现在我们登录一下看下效果:

会发现,多了一个Cookie,而且Cookie里面多了一个sid,不用联想了,这就是sessionId,这时候我们在刷新一下页面看下userInfo变成啥样了呢?

可以清晰的看到再次请求的时候,sessionId会装在Cookie中,然后发送给服务器,这时候服务器就知道了,咦,原来是上个人。这就是session。

由于现在服务器session存入的方式我们采用了服务器自带的内存,也叫session memory。如果server挂了怎么办呢,挂掉了内存就释放了啊,session就没了啊。这个时候就引出了另外一个问题,session的可持续化。

  • session的可持续化

session的可持续化方式简单的理解就是让session可以在生命周期内一直存在,可以把session存入db中,可以是MongoDB,可以是redis,上代码,我们这里用MongoDB吧,个人比较喜爱。

引入中间件:

var MongoStore = require('connect-mongo')(session);
复制代码
app.use(cookie('express_cookie'));
app.use(session({
    secret: 'express_cookie',
    resave: false,
    saveUninitialized: true,
    cookie: { maxAge: 60 * 1000 * 30 },
    rolling: true,
    store: new MongoStore({
        url: 'mongodb://127.0.0.1:27017/demo',
        collection: 'sessions'
    })
}));
app.post('/login', function (req, res) {
    User.findOne({
        username: req.body.username
    }).then(function (userInfo) {
        if (!userInfo) {
            console.log('user is not exist.');
            return;
        }
        var data = {};
        data['username'] = userInfo.username;
        data['password'] = userInfo.password;
        req.session.userInfo = data;
        res.status(200).json(data);
    })
        .catch(function (e) {
            console.log(e);
        })
})
复制代码

http请求与响应部分我们就不看了,直接看server跟DB。

server中我们将userInfo放入session中

var data = {};
data['username'] = userInfo.username;
data['password'] = userInfo.password;
req.session.userInfo = data;

查看DB

咦,一条session就在DB中诞生了,这里要注意的是,session不是设置的时候就会存入DB中的,包括内存等等,而且响应成功的时候才会存入,一定要注意,不然坑的就是你。

然后刷新页面看下效果。

似不似,session中就有了user信息。好了到这里关于session持久化的问题也解决了。

登出功能就很简单了,销毁session就ok了,代码如下:

app.get("/loginOut",function(req,res){
    req.session.destroy(function(err){
        console.log(err);
    })
    res.send('退出登录成功');
});

Redis方式:

中间件以及使用:

复制代码
var RedisStrore = require('connect-redis')(session);
app.use(session({
    secret: 'express_cookie',
    resave: false,
    saveUninitialized: true,
    cookie: { maxAge: 60 * 1000 * 30 },
    rolling: true,
    store: new RedisStrore({})
}));
复制代码

总结:第一次登陆请求的时候,服务器会颁发一个sessionId,响应的时候将sessionId放入cookie中返回给浏览器,此时session已存入DB中,当再次请求的时候携带着sessionId进入服务器中,获取session信息,服务器还是会记得我

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

全面了解cookie和session

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

全面了解cookie和session

http协议:http即超文本传输协议(万维网定义的),一种基于浏览器请求与服务器响应的链接,它是一个很纯粹的传输协议。http协议主要的特征就是它是一种无状态的协议(只针对cookie与session问题),在客户端连续向服务器发送请求的
2023-01-31

cookie,session和token详解

文章目录 前言一、cookie1.1 cookie简介1.2 cookie作用 二、session2.1 session简介2.2 session作用 三、token3.1 token简介3.2 token作用 四、区别
2023-08-20

怎样解析Cookie和Session

今天就跟大家聊聊有关怎样解析Cookie和Session,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.Cookie概念当用户使用浏览器首次访问一个支持Cookie的网站的时候,用
2023-06-02

理解cookie和session机制

cookie和session机制之间的区别与联系
2023-06-03

详解Javaweb状态管理的Session和Cookie

这篇文章主要介绍了Javaweb状态管理的Session和Cookie,将浏览器与web服务器之间多次交互当做一个整体来处理,并且多次交互所涉及的数据(状态)保存下来,需要的朋友可以参考下
2023-05-20

Laravel操作session和cookie的教程详解

这篇文章主要为大家详细介绍了Laravel操作session和cookie的教程,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
2023-02-09

Laravel中不能使用COOKIE和SESSION怎么解决

本篇内容主要讲解“Laravel中不能使用COOKIE和SESSION怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Laravel中不能使用COOKIE和SESSION怎么解决”吧!CO
2023-07-04

PHP中的Session和Cookie有何区别?如何应用?(请解释PHP中Session和Cookie的区别及它们的应用场景。)

Session和Cookie是用于在HTTP请求间存储用户数据的不同机制。Session存储于服务器端,持续时间限于会话,安全性较高,适用于存储会话相关信息;Cookie存储于客户端浏览器,持续时间更长,存储量有限,适用于存储持久偏好和设置。选择时考虑数据量、安全性、持续时间、用户隐私和浏览器支持等因素。
PHP中的Session和Cookie有何区别?如何应用?(请解释PHP中Session和Cookie的区别及它们的应用场景。)
2024-04-02

全面了解PPP Multilink

PPP Multilink是一种使用多个物理链路组合形成一个逻辑链路的协议。它将多个串行链路绑定在一起,使它们在逻辑上像一个高带宽的链路一样工作。PPP Multilink通过将数据包分割成小的片段,并在不同的链路上传输这些片段来实现负载均
2023-09-23

全面了解python字符串和字典

很多序列的方法字符串同样适用, 但是,字符串是不可变的,所以一些试图改变字符串的方法是不可用的 1 字符串格式化 1)用元组或者字典格式化字符串 format = "hello,%s.s% enough for you" values =
2022-06-04

电脑上的cookie存储在哪里?全面解析

电脑上的cookie是什么?当你访问一个网站时,它会将一些文本存储在你的电脑上。这个文本被称为cookie,它包含该网站相关的信息。cookie就像是一个网站在你电脑上的“名片”,存储着你在该网站上的一些行为,例如你自己选择的语言、登陆状
电脑上的cookie存储在哪里?全面解析
2024-01-19

全面了解SpringBoot拦截器

在本文中,我们将详细介绍SpringBoot中的拦截器,包括拦截器的概念、作用、实现方式、执行顺序、生命周期以及高级应用。最后,我们还将探讨拦截器的性能优化策略和常见问题。 1. 拦截器的概念和作用 1.1 什么是拦截器 拦截器(Inter
2023-08-19

全面解读canvas:深入了解canvas方法的全貌

全面解读canvas:深入了解canvas方法的全貌,需要具体代码示例引言:Canvas是HTML5新增的一个标签,可以通过JavaScript脚本绘制图形、动画和其他视觉效果。它为开发者提供了一个强大的平台,可以创建各种各样的图形和视觉
全面解读canvas:深入了解canvas方法的全貌
2024-01-17

全面了解Python的getattr(),setattr(),delattr(),hasattr()

1. getattr()函数是Python自省的核心函数,具体使用大体如下:class A: def __init__(self): self.name = 'zhangjing' #self.age='24' def method(
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录