虽然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. JUnit出错,却没有显示任何报错信息【待解答】

    JUnit测试代码如下: 原因分析: JUnit测试单元里,测试函数好像不能带参数? 解决办法: 发现测试函数testBookShopDaoUpdateBookStock(int isbn)里的参数i ...

  2. GPU编程自学5 —— 线程协作

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

  3. 5天突击GRE(155+170+4.0)

    个人认为最靠谱GRE经验,没有之一 虽然分数并不高(V 155 + Q 170 + AW 4.0),但是自认为有很多很多可以拿来给短期突击同学的宝贵经验. 首先是自己的背景,交大英语教改实验班(交大同 ...

  4. Vue(2) : Vue for Gank.io

    简介 最近学习Vue2.0,由于不懂前端知识,学习过程比较缓慢.文档学习过程如下: 通读vue官文 通读vue-router 2中文指南 学习axios 通读vuex官文 数据接口 再次感谢代码家的G ...

  5. Leetcode 814. Binary Tree Pruning

    dfs 要点是这一句: return node.val==1 or node.left or node.right 完整代码: # Definition for a binary tree node. ...

  6. HDU 1033

    http://acm.hdu.edu.cn/showproblem.php?pid=1033 这题的题干说的很绕,结合样例不难理解题意,走折线,A代表顺时针,V代表逆时针,给一个包含A和V的字符串,输 ...

  7. 在Fragment中加一个嵌套了ListView的ScrollView(一)

    首先介绍一下这个程序的功能: 1.顶部有两个可以切换Fragment的Button 2.在其中一个Fragment中里有个ScrollView,ScrollView中有ViewFlipper,List ...

  8. How to input the newline in Numbers of Mac?

    newline control+enter

  9. 【剑指offer15】二进制中1的个数(位运算),C++实现

    原创博文,转载请注明出处! # 本文是牛客网<剑指offer>刷题笔记 1.题目 # 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.例如,把9表示成二进制是1001,有两 ...

  10. (转)3D LUT

    这是 @Air君·Saunato·LoFoTo 大神运用3DLUT的作品 这是借用昔年大神 @昔年Olivia 用3DLUT的片片 http://paopaopaojiao.lofter.com/po ...