之前的文章我们介绍了一下 koa koa-static静态资源中间件,本篇文章我们来看一下 koa 中 cookie 和 session 的使用。

cookie 是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域名的时候共享数据。

HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页 面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何关系的。

我们将之前项目中的 app.js 改为如下代码:

 //引入 koa模块
const Koa = require('koa');
const Router = require('koa-router');
const views = require('koa-views');
const static = require('koa-static'); //实例化
const app = new Koa();
const router = new Router(); //配置静态资源中间件
app.use(static(__dirname + "/static")); //配置模板引擎中间件
app.use(views('views', {
extension: 'ejs'
})); router.get('/', async (ctx) => {
// 设置 cookie
ctx.cookies.set('userinfo',encodeURIComponent('张三'),{maxAge:10*1000})
await ctx.render('index', {});
}); router.get('/news', async (ctx) => {
// 获取 cookie
console.log(decodeURIComponent(ctx.cookies.get('userinfo')));
await ctx.render('index', {});
}); //启动路由
app.use(router.routes());
app.use(router.allowedMethods()); app.listen(3000);

我们在 router.get("/" ) 中通过 ctx.cookie.set() 的形式设置了一个 "userifon" 的 cookie ,然后在 router.get("/news" ) 中通过 ctx.cookie.get() 的形式来获取我们设置的 userinfo 的 cookie 值。

当我们运行 localhost:3000 后再运行 localhost:3000/news 时,我们在代码编辑器控制台可以看到如下输出结果:

从上图可以看出我们已经获取到了 userinfo = "张三" 的 cookie 值。

在 ctx.cookie.set() 中第三个参数为一个对象,里面有一些可选参数,如上面我们设置了一个 maxAge:10 * 1000;意思是该 cookie 值存储时间为 10 * 1000 毫秒,即 10 秒钟,在 10 秒之后会消失,还有其他可选参数,如下:

在上面的程序中,我们还用到了

encodeURIComponent 和 decodeURIComponent 

上面的两个名词分别表示对参数编码和解码,我们在传输数据的时候如果是汉字,如 "张三",就需要对其编码和解码,这样才能对内容做正确的传输。

接下来我们再看一下 koa 中 session 的使用。

session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。当浏览器访问服务器并发送第一次请求时,服务器端会创建一个 session 对象,生 成一个类似于 key,value 的键值对, 然后将 key(cookie)返回到浏览器(客户)端,浏览 器下次再访问时,携带 key(cookie),找到对应的 session(value)。 客户的信息都保存 在 session 中。

使用 koa 中的 session,我们需要安装 koa-session 的模块

npm install koa-session --save

我们将上面的 app.js 改为如下:

 //引入 koa模块
const Koa = require('koa');
const Router = require('koa-router');
const views = require('koa-views');
const static = require('koa-static');
const session = require('koa-session'); //实例化
const app = new Koa();
const router = new Router(); //配置静态资源中间件
app.use(static(__dirname + "/static")); //配置模板引擎中间件
app.use(views('views', {
extension: 'ejs'
})); //配置session的中间件
app.keys = ['some secret hurr']; /**cookie的签名 默认*/
const CONFIG = {
key: 'koa:sess', /** 默认 */
maxAge: 10000, /** cookie的过期时间 */
overwrite: true, /** 默认 可以重写过期时间 */
httpOnly: true, /** true表示只有服务器端可以获取 cookie */
signed: true, /** 默认 签名 */
rolling: true, /** 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false) */
renew: false, /** 当用户进行浏览器操作时刷新 cookie 过期时间 */
};
app.use(session(CONFIG, app)); router.get('/', async (ctx) => {
// 设置 cookie
ctx.session.userinfo='张三';
await ctx.render('index', {});
}); router.get('/news', async (ctx) => {
// 获取 cookie
console.log(ctx.session.userinfo);
await ctx.render('index', {});
}); //启动路由
app.use(router.routes());
app.use(router.allowedMethods()); app.listen(3000);

如上,我们需要在最开头引入我们的 koa-session 模块,然后设置 session 中间件。session 中也有类似于 cookie 的可选值,其中我们只需要修改 maxAge,rolling 和 renew 三个值即可。

  maxAge:过期时间,以毫秒为单位。

  rolling:当我们每次有浏览器请求时会重新刷新我们的 session 过期时间,是一个具体的时间值,如 12:00:00。

  renew:当我们每次有浏览器请求时会重新刷新我们的 session 过期时间,是一个时间范围,如 5000 毫秒。

接下来我们就可以在我们的浏览器中使用 session 了,我们在进入 localhost:3000 时设置一个 userinfo="张三",当进入 localhost:3000/news 时在代码编辑器后台打印输出这个 userinfo,如下:

我们拿到了 userinfo:"张三" 的值。

现在我们来看一下 cookie 和 session 的区别:

  1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。

  2、cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session。

  3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用 cookie。

  4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。

koa2 从入门到进阶之路 (七)的更多相关文章

  1. koa2 从入门到进阶之路 (二)

    之前的文章我们已经能够在本地启动一个简单的项目,本章我们来看一下 koa 路由,get 传值,动态路由. 一.Koa 路由 路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP ...

  2. koa2 从入门到进阶之路 (一)

    首先我们先来了解一下 Koa 是什么,https://koa.bootcss.com/,这是 Koa 的官方网站,映入眼帘的第一句就是 Koa -- 基于 Node.js 平台的下一代 web 开发框 ...

  3. koa2 从入门到进阶之路 (五)

    之前的文章我们介绍了一下 koa 中使用 ejs 模板及页面渲染,本篇文章我们来看一下 koa post提交数据及 koa-bodyparser中间件. 在前端页面中,不免会用到 form 表单和 p ...

  4. koa2 从入门到进阶之路 (四)

    之前的文章我们介绍了一下 koa 中间件 以及 koa 中间件的洋葱图执行流程,本篇文章我们来看一下 koa 中使用 ejs 模板及页面渲染. 在 Express 中,我们经常会用 ejs 模板来渲染 ...

  5. koa2 从入门到进阶之路 (三)

    之前的文章我们介绍了一下 koa 路由,get 传值,动态路由,本节我们看一下 koa 中间件 以及 koa 中间件的洋葱图执行流程. 一.什么是 Koa 的中间件 通俗的讲:中间件就是匹配路由之前或 ...

  6. koa2 从入门到进阶之路 (六)

    之前的文章我们介绍了一下 koa post提交数据及 koa-bodyparser中间件,本篇文章我们来看一下 koa-static静态资源中间件. 我们在之前的目录想引入外部的 js,css,img ...

  7. React 从入门到进阶之路(七)

    之前的文章我们介绍了 React 表单详解 约束性和非约束性组件 input text checkbox radio  select  textarea  以及获取表单的内容.接下来我们将介绍 Rea ...

  8. Python 爬虫从入门到进阶之路(七)

    在之前的文章中我们一直用到的库是 urllib.request,该库已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Hum ...

  9. Java 从入门到进阶之路(七)

    在之前的文章中我们介绍了一下 java 中的对象和类,接下来我们来看一下 Java 中的方法重载. 在显示生活中,我们肯定会遇到这样一个问题,那就是我们再商场买东西的时候在付账时的选择.如下 A:在收 ...

随机推荐

  1. 还不知道如何实践微服务的Java程序员,这遍文章千万不要错过!

    作者:古霜卡比 前言 本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件.本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节. 要理解微服务 ...

  2. NodeJS4-5静态资源服务器实战_优化压缩文件

    浏览器控制台看一下RequestHeader有一个Accept-Encoding,而RespondHeaders中也会有一个Content-Encoding和他进行对应. Accept-Encodin ...

  3. 《Java基础知识》Java锁详解(volatile,synchronized等)

    volatile: 让变量每次在使用的时候,都从主存中取. volatile具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正确性”,也就是说不保证线程执 ...

  4. java程序员面试经历(不忘初心,永不放弃,方得始终)。

    其实一直想静下心好好写一点博客,记录下青春,但一直忙于学习,写bug.....转眼间2017只剩下最后几天,岁月无情划过,不留痕迹,唯有稀疏地中海.哈哈,本篇文章主要是想分享下刚毕业入门找工作的一点小 ...

  5. 2019最新EI源刊目录

    2D Materials Journal3D Printing and Additive Manufacturing Journal3D Research Journal3DTV-Conference ...

  6. ubuntu14.04编译vim8.1

    安装依赖 这一步其实我没做,直接下载编译成功了.估计有些包不是必需的.姑且列在这里供参考 sudo apt install libncurses5-dev libgnome2-dev libgnome ...

  7. [译]C# 7系列,Part 6: Read-only structs 只读结构

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/11/21/c-7-series-part-6-read-only-structs/ 背景 在.NET世 ...

  8. 使用ASP.NET Core 3.x 构建 RESTful API - 3.4 内容协商

    现在,当谈论起 RESTful Web API 的时候,人们总会想到 JSON.但是实际上,JSON 和 RESTful API 没有半毛钱关系,只不过 JSON 恰好是RESTful API 结果的 ...

  9. FCC---CSS Flexbox: Apply the flex-direction Property to Create a Column in the Tweet Embed

    The tweet embed header and footer used the flex-direction property earlier with a row value. Similar ...

  10. C++做四则运算的MFC计算器(一)MFC界面创建

    学习最有效的方法就是实战,这两篇文章写了做MFC加减乘除计算器的过程. 第一写前台MFC界面搭建,第二写后台计算原理及代码. MFC编程参考教程:http://www.jizhuomi.com/sch ...