虽然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. ajaxFileUpload的data数据带pre标签

    解决办法: var ret = jQuery.parseJSON(jQuery(data).text());

  2. 在servlet中的中文乱码,相对路径和绝对路径

    默认情况下在servlet中的中文是显示不出来的,解决问题就是加resp.setContentType("text/html;charset=gbk"); 而且这句加的话必须写在P ...

  3. Visual studio 生成后事件说明

      在“配置属性->生成事件->生成后事件”属性页中的“命令行”编辑框中输入如下命令: copy "$(ProjectDir)$(IntDir)\$(ProjectName).t ...

  4. C语言学习之指针

    指针这块,看了好久才有点头绪,稍微有点理解了. 一.指针申明以及赋值 int *p; 这样就声明了一个int型的指针p,这个p就是指针变量,可能上述的书写方式会混淆我们队指针的理解(*号) 我们可以这 ...

  5. 《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)

    4.4.3 约束(Pattern的一部分) 前面我们已经介绍了条件约束在Pattern中位置了,那么什么是条件约束呢?简单来说就是一个返回true或者false的表达式,比如下面的5小于6,就是一个约 ...

  6. 《Unity 3D游戏客户端基础框架》消息系统

    功能分析: 首先,我们必须先明确一个消息系统的核心功能: 一个通用的事件监听器 管理各个业务监听的事件类型(注册和解绑事件监听器) 全局广播事件 广播事件所传参数数量和数据类型都是可变的(数量可以是 ...

  7. Okhttp之连接池ConnectionPool简单分析(一)

    开篇声明:由于本篇博文用到的一些观点或者结论在之前的博文中都已经分析过,所以本篇博文直接拿来用,建议读此博文的Monkey们按照下面的顺序读一下博主以下博文,以便于对此篇博文的理解: <Okht ...

  8. php 路径问题

    今天迁移网站服务器时,路径出错: 解决办法: 在网站首页根目录 设置define 全局变量 ——根目录: 在涉及目录的地方,统统替换为 根目录:

  9. 哈工大LTP语言分析:分词、词性标注、句法分析等

    1. LTP介绍和安装 LTP语言云官网  在线演示 | 语言云(语言技术平台云 LTP-Cloud) 安装LTP的python接口包 $ sudo pip install pyltp 模型文件下载 ...

  10. swift 定义枚举和结构体 及使用

    //定义枚举 enum MapDirection { case North case South case East case West func simpleDescription() -> ...