koa2 从入门到进阶之路 (七)
之前的文章我们介绍了一下 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 的使用。
使用 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 从入门到进阶之路 (七)的更多相关文章
- koa2 从入门到进阶之路 (二)
之前的文章我们已经能够在本地启动一个简单的项目,本章我们来看一下 koa 路由,get 传值,动态路由. 一.Koa 路由 路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP ...
- koa2 从入门到进阶之路 (一)
首先我们先来了解一下 Koa 是什么,https://koa.bootcss.com/,这是 Koa 的官方网站,映入眼帘的第一句就是 Koa -- 基于 Node.js 平台的下一代 web 开发框 ...
- koa2 从入门到进阶之路 (五)
之前的文章我们介绍了一下 koa 中使用 ejs 模板及页面渲染,本篇文章我们来看一下 koa post提交数据及 koa-bodyparser中间件. 在前端页面中,不免会用到 form 表单和 p ...
- koa2 从入门到进阶之路 (四)
之前的文章我们介绍了一下 koa 中间件 以及 koa 中间件的洋葱图执行流程,本篇文章我们来看一下 koa 中使用 ejs 模板及页面渲染. 在 Express 中,我们经常会用 ejs 模板来渲染 ...
- koa2 从入门到进阶之路 (三)
之前的文章我们介绍了一下 koa 路由,get 传值,动态路由,本节我们看一下 koa 中间件 以及 koa 中间件的洋葱图执行流程. 一.什么是 Koa 的中间件 通俗的讲:中间件就是匹配路由之前或 ...
- koa2 从入门到进阶之路 (六)
之前的文章我们介绍了一下 koa post提交数据及 koa-bodyparser中间件,本篇文章我们来看一下 koa-static静态资源中间件. 我们在之前的目录想引入外部的 js,css,img ...
- React 从入门到进阶之路(七)
之前的文章我们介绍了 React 表单详解 约束性和非约束性组件 input text checkbox radio select textarea 以及获取表单的内容.接下来我们将介绍 Rea ...
- Python 爬虫从入门到进阶之路(七)
在之前的文章中我们一直用到的库是 urllib.request,该库已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Hum ...
- Java 从入门到进阶之路(七)
在之前的文章中我们介绍了一下 java 中的对象和类,接下来我们来看一下 Java 中的方法重载. 在显示生活中,我们肯定会遇到这样一个问题,那就是我们再商场买东西的时候在付账时的选择.如下 A:在收 ...
随机推荐
- MySQL使用可重复读作为默认隔离级别的原因
一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle.SQL Server等,而MySQL却使用可重复读(Read-Repeatable,RR). ...
- VS Code 成主宰、Vue 备受热捧!2019 前端开发趋势必读
前端在生产和开发中占据着越来越重要的地位,PC 端.手机端.桌面端.智能手表端等等设备都离不开前端的身影.本文将围绕框架.编程语言.工具.React.Vue 等方面,全面回顾 2019 年前端与 We ...
- .NET 中数据访问用的 DBHelper(Sql Server) 类
public class DBHelper { private static string DBConnectString = "Data Source=.;Initial Catalog= ...
- java基础- Java编程规范与注释
一 前言 java编程规约是指在java代码编写过程中通俗的约定:通常我们是要遵守这些规范:这好比我们在生活中要遵守的道德准则,如果你做的事情超出了道德的底线,那就有可能会受到社会抨击:在java编程 ...
- 小白的springboot之路(十三)、过滤器、监听器、拦截器
0.前言 过滤器.监听器.拦截器在实际开发中经常需要用到,下面我们来介绍一下spring boot中如何使用: 一.------ 过滤器 ----- 1.作用: 过滤器是客户端与服务器资源文件之间的一 ...
- 安装Visual Studio Code并汉化
安装很简单,直接点击安装文件,然后一直点击next就可以了.这款软件是免费的,不需要破解. 下载地址 这里需要使用快捷键[Ctrl+Shift+P],在弹出的搜索框中输入[configure lang ...
- c++--语言本身
c++ 面向对象概念(cout cin 类.对象 面向对象和面向过程求解问题) 易犯错误模型(引入成员函数的必要性) C语言和C++语言的关系 namespace 定义(嵌套).使用.标准命名空间st ...
- Dubbo环境搭建-ZooKeeper注册中心
场景 Dubbo简介与基本概念: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103555224 注: 博客: https:// ...
- Python中删除空白字符
主要参考 Stackoverflow答案总结. 空白字符一般指以下几种字符: space,tab, linefeed, return, formfeed, and vertical tab中英文对照表 ...
- java开发问题两三事(1)
1. 场景描述 最近在工作中碰到的几个问题,有点坑,记录下,遇到相同或类似问题的朋友可以参考下. 2. 解决方案 2.1 Disconnected from the target VM idea控制台 ...