虽然session与cookie是分开保存的.但是session中的数据经过加密处理后默认保存在一个cookie中.因此在使用session中间件之前必须使用cookieParser中间件.

app.use(express.session([options]));

options参数的具体取值:

key:字符串,用于指定用来保存session的cookie名称,默认为coomect.sid.

store:属性值为一个用来保存session数据的第三方存储对象.

fingerprint:属性值为一个自定义指纹生成函数.

cookie:属性值为一个用来指定保存session数据的cookie设置的对象,默认值为{path:"/",httpOnly:true,maxAge:14400000}.

    path是cookie保存路径.httpOnly是否只针对http保存cookie,

    maxAge用于指定cookie的过期时间,单位为毫秒.

secret:字符串.用来对session数据进行加密的字符串.这个属性值为必须指定的属性.

在使用了session中间件后,代表客户端请求的http.IncomingMessage对象就具有了一个session属性.该属性保存了所有session数据.

 var express=require("express");
var app=express();
app.use(express.cookieParser());
app.use(express.session({secret:"test"}));
app.get("/index.html", function (req,res) {
res.sendfile(__dirname+"/index.html");
req.session.username="思思博士";
req.session.password="123456"
}); app.post("/index.html", function (req,res) {
res.write("用户名:"+req.session.username+"<br/>");
res.write("密码:"+req.session.password);
res.end();
}); app.listen(1337,"127.0.0.1", function () {
console.log("开始监听:1337");
});
 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>session中间件的使用</title>
<script type="text/javascript">
function getSession(){
var xhr=new XMLHttpRequest();
xhr.open("post","index.html",true);
xhr.onload= function () {
if(this.status=200){
document.getElementById("res").innerHTML=this.response;
}
};
xhr.send();
}
</script>
</head>
<body>
<input type="button" value="提交" onclick="getSession();" />
<div id="res"></div>
</body>
</html>

可以使用session属性对象的regenerate方法重新生成一个session管理器.

req.session.regenerate(function(err){

});

修改服务器端代码:

 var fs=require("fs");
var express=require("express");
var app=express();
app.use(express.cookieParser());
app.use(express.session({secret:"test"}));
app.get("/index.html", function (req,res) {
res.writeHead(200,{"Content-Type":"text/html"});
res.write("<head><meta charset='utf-8' /><title>session中间件的简单使用事例</title></head>");
var file=fs.createReadStream("index.html");
req.session.username="思思博士";
req.session.password="123456";
req.session.regenerate(function (err) {
if(err) console.log("session重新初始化失败.");
else console.log("session被重新初始化.");
});
file.pipe(res);
});
app.post("/index.html", function (req,res) {
res.write("用户名:"+req.session.username+"<br/>");
res.write("密码:"+req.session.password);
res.end();
});
app.listen(1337,"127.0.0.1", function () {
console.log("开始监听:1337");
});

或者:

 var fs=require("fs");
var express=require("express");
var app=express();
app.use(express.cookieParser());
app.use(express.session({secret:"test"}));
app.get("/index.html", function (req,res) {
res.sendfile(__dirname+"/index.html");
req.session.username="思思博士";
req.session.password="123456";
req.session.regenerate(function (err) {
if(err) console.log("session重新初始化失败.");
else console.log("session被重新初始化.");
});
});
app.post("/index.html", function (req,res) {
res.write("用户名:"+req.session.username+"<br/>");
res.write("密码:"+req.session.password);
res.end();
});
app.listen(1337,"127.0.0.1", function () {
console.log("开始监听:1337");
});

单击按钮后.获取的都是undefind了.

利用session的destroy方法销毁在用的session管理器,当服务器接收到下一个请求时,将重新生成一个session管理器.

req.session.destroy(function(err){

});

 var fs=require("fs");
var express=require("express");
var app=express();
app.use(express.cookieParser());
app.use(express.session({secret:"test"}));
app.get("/index.html", function (req,res) {
res.sendfile(__dirname+"/index.html");
req.session.username="思思博士";
req.session.password="123456";
req.session.destroy(function (err) {
if(err) console.log("session销毁失败.");
else console.log("session被销毁.");
});
});
app.post("/index.html", function (req,res) {
res.write("用户名:"+req.session.username+"<br/>");
res.write("密码:"+req.session.password);
res.end();
});
app.listen(1337,"127.0.0.1", function () {
console.log("开始监听:1337");
});

设置过期时间:

maxAge属性值来设置用于保存session数据的cookie过期时间或获取该cookie的剩余时间.

 var fs=require("fs");
var express=require("express");
var app=express();
app.use(express.cookieParser());
app.use(express.session({secret:"test"}));
app.get("/index.html", function (req,res) {
res.sendfile(__dirname+"/index.html");
var long=30*1000;
req.session.cookie.expires=new Date(Date.now()+long);
req.session.cookie.maxAge=long;
setInterval(function () {
console.log("cookie剩余时间:"+req.session.cookie.maxAge);
},1000);
});
app.listen(1337,"127.0.0.1", function () {
console.log("开始监听:1337");
});

每一秒显示一个过期时间

node的express中间件之session的更多相关文章

  1. Node.js + Express中间件详解

    使用中间件 Express是一种路由和中间件Web框架,它具有自己的最小功能:Express应用程序本质上是一系列中间件函数调用. 中间件函数是可以访问请求对象 (req),响应对象(res)以及应用 ...

  2. node的express中间件之static之ajax提交json

    static中间件可以使客户端直接访问网站中的所有静态文件. 利用这个功能可以直接把服务器上的静态页面直接读取出来返回到客户端. 从客户端点击一个按钮,向服务器端发送数据.并且插入到mysql数据库中 ...

  3. node的express中间件之directory

    direcotry中间件用于在浏览器中流出网站某个目录下的所有子目录及文件. app.use(express.directory(path,[options])); 查看网站根目录下的文件及目录 va ...

  4. node的express中间件之bodyParser

    bodyParser用于解析客户端请求的body中的内容,内部使用JSON编码处理,url编码处理以及对于文件的上传处理. 下面是一个文件上传的例子. 建立一个1.html页面 <!DOCTYP ...

  5. express 中间件的简单应用与实现

    express 中间件的简单应用与实现 看了慕课网双越老师的课之后结合自己的理解做了一些简单的总结,如有不恰当之处,欢迎指正. 提到 express 就不得不提到中间件,接下来就简单的介绍一下 exp ...

  6. Node.js连接Mysql,并把连接集成进Express中间件中

    引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...

  7. body-parser Node.js(Express) HTTP请求体解析中间件

    body-parser Node.js(Express) HTTP请求体解析中间件 2016年06月08日     781     声明 在HTTP请求中,POST.PUT和PATCH三种请求方法中包 ...

  8. 对于Node中Express框架的中间件概念的感知

    中间件是什么呢? 中间件就是客户端http请求发起传送到服务器和服务器返回响应之间的一些处理函数. 为什么要使用中间件? 通过中间件,可以对数据进行操作使得我们能方便地操作请求数据编写服务器响应.如b ...

  9. express 框架之session

    一.什么是session? 最近在学习node.js 的express框架,接触到了关于session方面的内容.翻阅了一些的博客,学到了不少东西,发现一篇博文讲的很好,概念内容摘抄如下: Sessi ...

随机推荐

  1. Jenkins分享

    2016-02-26 小马哥 程序员之路   PPT下载地址:http://pan.baidu.com/s/1i4pw6oP   Jenkins 是一个开源软件项目,旨在提供一个开放易用的软件平台,使 ...

  2. jsp笔记总结

    第一章 JavaWeb简介 1.什么是Web应用程序 什么是Web应用程序是一种通过Web访问的应用程序.Web应用程序一个最大优点就是用户很容易访问.用户只需要有浏览器即可,不需要再安装其他软件.W ...

  3. Anaconda使用、conda的环境管理和包管理

    关于Anaconda的安装参考本人之前的博文 http://www.cnblogs.com/bymo/p/8034661.html 关于Anaconda的概述和详细使用参考:https://www.j ...

  4. BDD测试框架Spock概要

    前言 为了找到一个适合自己的.更具操作性的.以DDD为核心的开发方法,我最近一直在摸索如何揉合BDD与DDD.围绕这个目标,我找到了Impact Mapping → Cucumber → Spock ...

  5. Android学习笔记之Activity详解

    1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...

  6. Python:版本升级(Mac OS X)

    Mac OS X 10.8及以后的版本都预装了Python 2.7,但是在Mac上(Unix-like OS)上修改Python的版本并不如Windows方便.这篇文章的目标是要将Mac自带的Pyth ...

  7. CodeForces - 258D:Little Elephant and Broken Sorting(概率DP)

    题意:长度为n的排列,m次交换xi, yi,每个交换x,y有50%的概率不发生,问逆序数的期望  .n, m <= 1000 思路:我们只用维护大小关系,dp[i][j]表示位置i的数比位置j的 ...

  8. [Luogu4630][APIO2018]Duathlon 铁人两项

    luogu 题目描述 比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行 ...

  9. win7下VS2010编译python3

    转自:http://www.cnblogs.com/fortwo/archive/2013/04/16/3023871.html 1.首先从python.org上:http://www.python. ...

  10. altera官方推荐时钟使用方法

    Register Combinational Logic Outputs If you use the output from combinational logic as a clock signa ...