Node.js中的Session,不要觉得简单哦。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ 。学习网站上有对应每一小节的在线练习大家可以去试试。

Cookie



在web应用中,多个请求之间共享“用户会话”是非常必要的。但HTTP1.0协议是无状态的。那这时Cookie就出现了。那Cookie又是如何处理的呢?

Cookie的处理:

服务端向客户端发送Cookie 客户端的浏览器把Cookie保存 然后在每次请求浏览器都会将Cookie发送到服务端 在HTML文档被发送之前,Web服务器通过传送HTTP 包头中的Set-Cookie 消息把一个cookie 发送到用户的浏览器中,如下示例:

Set-Cookie: name=value; Path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT;

其中比较重要的属性:

  • name=value:键值对,可以设置要保存的 Key/Value,注意这里的 name 不能和其他属性项的名字一样
  • Expires: 过期时间(秒),在设置的某个时间点后该 Cookie 就会失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT
  • maxAge: 最大失效时间(毫秒),设置在多少后失效
  • secure: 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效
  • Path: 表示 cookie 影响到的路,如 path=/。如果路径不能匹配时,浏览器则不发送这个Cookie
  • httpOnly:是微软对COOKIE做的扩展。如果在COOKIE中设置了“httpOnly”属性,则通过程序(JS脚本、applet等)将无法读取到COOKIE信息,防止XSS攻击产生

Node.js中的Cookie



node.js是如何想客户端发送cookie的呢? 有两个中方案:

使用response.writeHead,代码如下:

//设置过期时间为一分钟
var today = new Date();
var time = today.getTime() + 60*1000;
var time2 = new Date(time);
var timeObj = time2.toGMTString();
response.writeHead({
   ‘Set-Cookie‘:‘myCookie="type=ninja", "language=javascript";path="/";
   Expires=‘+timeObj+‘;httpOnly=true‘
});

缺点:使用response.writeHead只能发送一次头部,即只能调用一次,且不能与response.render共存,否则会报错。

使用response.cookie,代码示例如下:

response.cookie(‘haha‘, ‘name1=value1&name2=value2‘, {
maxAge:10*1000, path:‘/‘, httpOnly:true
});

语法: response.cookie(‘cookieName’, ‘name=value[name=value…]‘,[options]);

options 每个字段的意思在上文中都讲解了,这里不再重复阐述了。

Cookie的简单使用



express 在 4.x 版本之后,管理session和cookies等许多模块都不再直接包含在express中, `而是需要单独下载安装相应模块。

cookieParser安装:

$ npm install cookie-parser

使用方法:

var express      = require(‘express‘);
var cookieParser = require(‘cookie-parser‘);

var app = express();
app.use(cookieParser());

app.get(‘/‘, function (req, res) {
    // 检查 session 中的 isVisit 字段是否存在
    // 如果存在则增加一次,否则为 session 设置 isVisit 字段,并初始化为 1。
    if (req.cookie.isVisit) {
        req.cookie.isVisit++;
        res.send(‘<p>第 ‘ + req.cookie.isVisit + ‘次来此页面</p>‘);
    } else {
        req.cookie.isVisit = 1;
        res.send("欢迎第一次来这里");
        console.log("Cookies: ", req.cookies); //打印cookie
    }
});
app.listen(80);

什么是Session?



session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而session保存在服务器上。

客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么session机制就是通过检查服务器上的“客户明细表”来确认客户身份。

session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

两者的区别:

  • cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE。
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

所以建议:将登陆信息等重要信息存放为session、其他信息如果需要保留,可以放在cookie中

Session的简单应用



跟cookie一样都需要单独的安装和引用模块, 安装模块:$sudo npm install express-session 主要的方法就是 session(options),其中 options 中包含可选参数,主要有:

  • name: 设置 cookie 中,保存 session 的字段名称,默认为 connect.sid 。
  • store: session 的存储方式,默认存放在内存中,也可以使用 redis,mongodb 等。express 生态中都有相应模块的支持。
  • secret: 通过设置的 secret 字符串,来计算 hash 值并放在 cookie 中,使产生的 signedCookie 防篡改。
  • cookie: 设置存放 session id 的 cookie 的相关选项,默认为 (default: { path: ‘/’, httpOnly: true, secure: false, maxAge: null })
  • genid: 产生一个新的 session_id 时,所使用的函数, 默认使用 uid2 这个 npm 包。
  • rolling: 每个请求都重新设置一个 cookie,默认为 false。
  • resave: 即使 session 没有被修改,也保存 session 值,默认为 true。

示例:

var express = require(‘express‘);
var session = resuire(‘session‘);
var app = exoress();

app.user(session({
    secret: ‘hubwiz app‘, //secret的值建议使用随机字符串
    cookie: {maxAge: 60 * 1000 * 30} // 过期时间(毫秒)
}));
app.get(‘/‘, function (req, res) {
    if (req.session.sign) {//检查用户是否已经登录
        console.log(req.session);//打印session的值
        res.send(‘welecome <strong>‘ + req.session.name + ‘</strong>, 欢迎你再次登录‘);
    } else {//否则展示index页面
        req.session.sign = true;
        req.session.name = ‘汇智网‘;
        res.end(‘欢迎登陆!‘);
    }
});
app.listen(80);
时间: 2024-10-01 05:57:32

Node.js中的Session,不要觉得简单哦。的相关文章

Cookie和Session在Node.JS中的实践(二)

Cookie和Session在Node.JS中的实践(二) cookie篇在作者的上一篇文章Cookie和Session在Node.JS中的实践(一)已经是写得算是比较详细了,有兴趣可以翻看,这篇是session篇,重点在讨论seesion的特性.概念,以及session和cookie的区别和联系. 之前有人问我,这个问题有必要长篇大论的探讨吗?其实只要我觉得这个技术点重要而且具有迷惑性,就值得去写.去探讨,否则你很难完全明白.写这种文章有两个好处: 首先,于作者而言,写出来文章让大家一起理解某

利用Node.js实现模拟Session验证的登陆

1.身份验证和用户登陆 在一般的Web应用上,如果要实现用户登陆,最常用,也是最简单的方法就是使用Session,基本的思路是在Session中保留一些用户身份信息,然后每次在Session中取,如果信息不正确或不存在,那么身份验证失败,正确则成功. Session和Cookie是两个很相似的东西,都是字符串,只不过Session是保存在服务器上的,而Cookie是保存在本地的,所以Cookie是不能用作身份验证的.Session故名思议,肯定和客户端与服务器间建立的会话相关,Session的工

在Node.js中使用RabbitMQ系列二 任务队列

在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心解决的问题是避免立即处理那些耗时的任务,也就是避免请求-响应的这种同步模式.取而代之的是我们通过调度算法,让这些耗时的任务之后再执行,也就是采用异步的模式.我们需要将一条消息封装成一个任务,并且将它添加到任务队列里面.后台会运行多个工作进程(worker process),通过调度算法,将队列里的任

node.js中的交互式运行环境-REPL

<Node.js权威指南>第2章Node.js中的交互式运行环境--REPL 开发者可以在该环境中很方便地输入各种JavaScript表达式并观察表达式的运行结果. 在学习Node.js框架的过程中,通过该运行环境的使用,我们可以很方便地了解Node.js中定义的各种对象所拥有的各种属性及方法.本节为大家介绍在REPL运行环境中操作变量 2.2 在REPL运行环境中操作变量 在REPL运行环境中,可以使用var关键字来定义一个变量并为其赋值,但是在输入了对其赋值进行的表达式后,该表达式的执行结

node.js中的exports和module.exports

不同的编程语言都有各自的代码组织和复用的方式,如.net.php中的命名空间,python中的import,ruby中的module等,来避免命名空间污染.一直都没搞清楚node中的exports和module.exports的区别,借此搞清楚node的代码模块复用方式. 首先怎么创建node中的modules. 可以直接创建一个文件作为module,如下module.js function writeLine(){ console.log("module.js"); } export

log4js-Node.js中的日志管理模块使用与封装

开发过程中,日志记录是必不可少的事情,尤其是生产系统中经常无法调试,因此日志就成了重要的调试信息来源. Node.js,已经有现成的开源日志模块,就是log4js,源码地址:点击打开链接 项目引用方法: npm install log4js 1.配置说明(仅以常用的dateFile日志类型举例,更多说明参考log4js-wiki): { "appenders": [ // 下面一行应该是用于跟express配合输出web请求url日志的 {"type": "

笔记-Node.js中的核心API之HTTP

最近正在学习Node,在图书馆借了基本关于Node的书,同时在网上查阅资料,颇有收获,但是整体感觉对Node的理解还是停留在一个很模棱两可的状态.比如Node中的模块,平时练习就接触到那么几个,其他的一些模块暂时只会在学习的时候接触到,不常用便就荒废了.正所谓好记心不如烂笔头,多做笔记还是更有利于理解和记忆.自己做的总结也方便回头复习,所以决定踏上漫长的修炼之旅-- Node提供了许多API,其中一些比较重要.这些核心的API是所有Node应用的支柱,你会不停的用到他们. HTTP服务器 Nod

使用 Raspberry Pi 上的传感器在 Node.js 中创建一个 IoT Bluemix 应用程序

先决条件 一个IBM Bluemix 帐号,一个 Raspberry Pi 2 或 3,一个 PIR 运动传感器 适用于本文的 Github 存储库 如果您是一位精明的 Bluemix 开发人员,您可能只想看看如何在 node.js 中与 IoT 建立连接,或者只想了解如何从此 github 存储库中拉取我的代码. git clone https://github.com/nicolefinnie/iot-nodejs-tutorial 以下是实现与 IBM IoT 平台连接在一起的 4 个 R

在Node.js中实现任务调度与执行

在Node.js中实现任务调度与执行 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 批处理是业务开发中经常会遇到的需求,比如银行对账单的处理,又比如广告邮件的推送. Node.js在批处理方面也有一些优秀的库,node-schedule就是其中之一. node-schedule是一个轻量级的.基于Node.js的.类似于cron的调度器工具.其介绍可查看: https://www.npmjs.com/package