个人总结: 这篇文章讲解了express框架中如何使用session,主要用了express-session这个包。更多可以参考npm.js来看,读完这篇文章需要10分钟。

摘选自网络:

文档概览

本文基于express、express-session实现了简易的登录/登出功能,完整的代码示例可以在这里找到。

环境初始化

首先,初始化项目

express -e

然后,安装依赖。

npm install

接着,安装session相关的包。

npm install --save express-session session-file-store

session相关配置

配置如下,并不复杂,可以见代码注释,或者参考官方文档

var express = require('express');
var app = express();
var session = require('express-session');
var FileStore = require('session-file-store')(session); var identityKey = 'skey'; app.use(session({
name: identityKey,
secret: 'chyingp', // 用来对session id相关的cookie进行签名
store: new FileStore(), // 本地存储session(文本文件,也可以选择其他store,比如redis的)
saveUninitialized: false, // 是否自动保存未初始化的会话,建议false
resave: false, // 是否每次都重新保存会话,建议false
cookie: {
maxAge: 10 * 1000 // 有效期,单位是毫秒
}
}));

实现登录/登出接口

创建测试账户数据

首先,在本地创建个文件,来保存可用于登录的账户信息,避免创建链接数据库的繁琐。

// users.js
module.exports = {
items: [
{name: 'chyingp', password: '123456'}
]
};

登录、登出接口实现

实现登录、登出接口,其中:

  • 登录:如果用户存在,则通过req.regenerate创建session,保存到本地,并通过Set-Cookie将session id保存到用户侧;
  • 登出:销毁session,并清除cookie;
var users = require('./users').items;

var findUser = function(name, password){
return users.find(function(item){
return item.name === name && item.password === password;
});
}; // 登录接口
app.post('/login', function(req, res, next){ var sess = req.session;
var user = findUser(req.body.name, req.body.password); if(user){
req.session.regenerate(function(err) {
if(err){
return res.json({ret_code: 2, ret_msg: '登录失败'});
} req.session.loginUser = user.name;
res.json({ret_code: 0, ret_msg: '登录成功'});
});
}else{
res.json({ret_code: 1, ret_msg: '账号或密码错误'});
}
}); // 退出登录
app.get('/logout', function(req, res, next){
// 备注:这里用的 session-file-store 在destroy 方法里,并没有销毁cookie
// 所以客户端的 cookie 还是存在,导致的问题 --> 退出登陆后,服务端检测到cookie
// 然后去查找对应的 session 文件,报错
// session-file-store 本身的bug req.session.destroy(function(err) {
if(err){
res.json({ret_code: 2, ret_msg: '退出登录失败'});
return;
} // req.session.loginUser = null;
res.clearCookie(identityKey);
res.redirect('/');
});
});

登录态判断

用户访问 http://127.0.0.1:3000 时,判断用户是否登录,如果是,则调到用户详情界面(简陋无比);如果没有登录,则跳到登录界面;

app.get('/', function(req, res, next){
var sess = req.session;
var loginUser = sess.loginUser;
var isLogined = !!loginUser; res.render('index', {
isLogined: isLogined,
name: loginUser || ''
});
});

UI界面

最后,看下登录、登出UI相关的代码。

<!DOCTYPE html>
<html>
<head>
<title>会话管理</title>
</head>
<body> <h1>会话管理</h1> <% if(isLogined){ %>
<p>当前登录用户:<%= name %>,<a href="/logout" id="logout">退出登陆</a></p>
<% }else{ %>
<form method="POST" action="/login">
<input type="text" id="name" name="name" value="chyingp" />
<input type="password" id="password" name="password" value="123456" />
<input type="submit" value="登录" id="login" />
</form>
<% } %> <script type="text/javascript" src="/jquery-3.1.0.min.js"></script>
<script type="text/javascript">
$('#login').click(function(evt){
evt.preventDefault(); $.ajax({
url: '/login',
type: 'POST',
data: {
name: $('#name').val(),
password: $('#password').val()
},
success: function(data){
if(data.ret_code === 0){
location.reload();
}
}
});
});
</script> </body>
</html>

相关链接

https://github.com/expressjs/session

NodeJS学习笔记 进阶 (7)express+session实现简易身份认证(ok)的更多相关文章

  1. Nodejs进阶:express+session实现简易身份认证

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 文档概览 本文基于express.express-session ...

  2. express+session实现简易身份认证

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 文章概览 本文基于express.express-session ...

  3. NodeJS学习笔记 进阶 (9)express+cookie-parser:签名机制深入剖析(ok)

    个人总结:这篇文章讲解了express框架种cookie的使用,需要引用cookie-parser这个包.读完这篇文章需要10分钟. 摘选自网络 文章导读 cookie-parser是Express的 ...

  4. NodeJS学习笔记 进阶 (8)express+morgan实现日志记录(ok)

    个人总结:这篇文章讲解了Express框架中日志记录插件morgan的示例.读完这篇文章需要10分钟 摘选自网络 章节概览 morgan是express默认的日志中间件,也可以脱离express,作为 ...

  5. NodeJS学习笔记 进阶 (13)Nodejs进阶:5分钟入门非对称加密用法

    个人总结:读完这篇文章需要5分钟,这篇文章讲解了Node.js非对称加密算法的实现. 摘录自网络 地址: https://github.com/chyingp/nodejs-learning-guid ...

  6. NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇

    个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...

  7. NodeJS学习笔记 进阶 (1)Nodejs进阶:服务端字符编解码&乱码处理(ok)

    个人总结:这篇文章主要讲解了Nodejs处理服务器乱码及编码的知识,读完这篇文章需要10分钟. 摘选自网络 写在前面 在web服务端开发中,字符的编解码几乎每天都要打交道.编解码一旦处理不当,就会出现 ...

  8. NodeJS学习笔记 进阶 (4)基于express+muter的文件上传(ok)

    个人总结:这篇文章主要讲了multer插件的使用,类似于formidable,可以用来处理post表单中的文件上传,读完这篇文章需要10分钟. 摘选自网络 概览 图片上传是web开发中经常用到的功能, ...

  9. NodeJS学习笔记 进阶 (3)Nodejs 进阶:Express 常用中间件 body-parser 实现解析(ok)

    个人总结:Node.js处理post表单需要body-parser,这篇文章进行了详细的讲解. 摘选自网络 写在前面 body-parser是非常常用的一个express中间件,作用是对http请求体 ...

随机推荐

  1. Java 以空格分割字符串

    Java中使用类似于 str.split("/"); 的方法可以很方便的实现将一个字符串分割为数组, 但是如果分隔符是一个(或几个)空格呢?? 我们的本能反应或许应该是 str.s ...

  2. sql server 无法创建索引 因为对象名称和索引名称重复

    需求分析:如下图所示,给T_DD_OP1200_Final表的Id字段添加主键,保存时弹出 “T_DD_OP1200_Final”表- 无法创建索引“PK_T_DD_OP1200_Final”. 因为 ...

  3. 虚拟机CentOS6.8下安装mycat

    安装mycat前,首先安装jdk1.7及以上版本 安装可参照 https://www.cnblogs.com/llhhll/p/9260913.html 下载mycat 1.6版本 wget   ht ...

  4. DotNetCore.1.0.1-VS2015Tools.Preview2.0.3 相关问题及解决办法

    本月16号,MS发布了 .NET Core 1.1.作为一个用贯MS产品的小盆友,我第一时间就把相关的安装包下载下来了,然后果断安装(入坑). 我猜你来看这篇博客可能遇到了和我一样的问题. 问题0:正 ...

  5. ActiveMQ学习笔记(8)----ActiveMQ的消息存储持久化

    1. 概述 ActiveMQ不仅支持persistent和non-persistent两种方式,还支持消息的恢复(recovery)方式. 2. PTP Queue的存储是很简单的,其实就是FIFO的 ...

  6. 结构化数据、半结构化数据、非结构化数据——Hadoop处理非结构化数据

    刚开始接触Hadoop ,指南中说Hadoop处理非结构化数据,学习数据库的时候,老师总提结构化数据,就是一张二维表,那非结构化数据是什么呢?难道是文本那样的文件?经过上网搜索,感觉这个帖子不错 网址 ...

  7. 路飞学城Python-Day15(模块二思维导图)

  8. HBuilder 连接小米手机

    (1)手机与电脑未用USB数据线连接(嘿嘿,这一部大家估计都做到了,可略过) (2)电脑上需要安装电脑版的手机助手,帮助手机顺利连接上(用安卓手机联调的话可安装360手机助手,若用iPhone的话可安 ...

  9. 洛谷 P4147 玉蟾宫 (最大子矩形问题)

    这道题用到了悬线法,非常牛逼,可以看这个论文. https://blog.csdn.net/twtsa/article/details/8120269 #include<cstdio> # ...

  10. [HAOI2015]树上染色(树形dp)

    [HAOI2015]树上染色 题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所 ...