1) session工作过程

1)用户登录后 把sessionID保存到Cookie中

2)用户在请求网站别的服务器的时候 由浏览器请求带上cookie发送到服务器

3)服务器拿到sessionID后 通过该ID 找到保存在服务器的用户信息

4)拿到用户信息进行处理

2)express-session 配置参数

name -cookie的名字

store -session 存储实例

cookie -session cookie设置(设置路径和时间等)

rollong -session 过期时间

具体参数可以看这个

​https://www.jianshu.com/p/86cf320bd58d​

属性

说明

​cookie​

默认值 ​​{ path: '/', httpOnly: true, secure: false, maxAge: null }​

​domain​

​cookie​​可以设置的域名,如果没有设置则cookie默认在当前域可以使用

​expires​

​cookie​​​失效时间,可以设置时间,不建议给固定时间,设置​​maxAge​​之后自动会生成这个值

​httpOnly​

属性禁止客户端​​JavaScript​​​的访问,禁止后不能使用​​document.cookie​

​maxAge​

设置​​cookie​​开始多少毫秒失效

​path​

默认值为域名的根路径

​secure​

为​​true​​​,​​https​​​才传递到服务器端。​​http​​是不会传递的

​genid​

设置创建​​session id​​​的自定义函数,默认使用 ​​uid-safe​​扩展来生成id,一定要保证创建的id不要重复。

​name​

在​​response​​​中​​sessionID​​​这个cookie的名称 ,即​​set-cookie​​​中​​sessionID​​​的​​key​​​,看一下源码片段:​​name = options.name or options.key or connect.sid​​​//很显然cookie的name默认是​​connect.sid​​​,而且首先获取到的​​name​​​而不是​​key​

​resave​

强制​​session​​​保存到​​session store​​​中 即使没有发生变化,默认为​​false​​​。 知道你的​​store​​​是否需要设置​​resave​​​的方法是通过查看你的​​store​​是否实现了​​touch​​方法(删除那些空闲的​​session​​​。同时这个方法也会通知​​session store​​​指定的​​session​​​是活动态的),如果实现了那么你可以用​​resave:false​​​,如果没有实现​​touch​​​方法,同时你的​​store​​​对保存的​​session​​​设置了一个过期的时间,那么建议你用​​resave:true​

​rolling​

在每次请求时强行设置​​cookie​​​,这将重置​​cookie​​​过期时间(默认:​​false​​​), 强制在每一个​​response​​​中都发送​​session​​​标识符的​​cookie​​​,即每次的​​response​​​都带有​​set-cookie​​​属性,使得客户端每次都重新设置​​cookie​​。 如果把这个值设置为true但是saveUnitialized设置为false,那么cookie不会被包含在响应中(没有初始化的session)

​saveUninitialized​

强制存储未初始化的​​session​​​(默认为​​true​​,建议手动添加)

​secret​

用来注册​​session id​​​到c​​ookie​​中,相当与一个密钥

​store​

​session​​​存储的实例子,一般可以用​​redis​​​和​​mangodb​​来实现

​unset​

默认是​​keep​​​ ,设置​​req.session​​​在什么时候可以设置。 ​​destory​​​:请求结束时候session摧毁,​​keep​​​: ​​session​​在存储中的值不变,在请求之间的修改将会忽略,而不保存 。

3)express session的使用

npm install express-session 安装

express 实现session_用户信息

4)在app里配置session

引用

var session =require('express-session')

设置

app.use(cookieParser('mySystem'));
app.use(session(
{

secret:"mySystem",//与cookieParser 的值要一样
cookie:{maxAge:5000},//作用时间 单位毫秒 5000就是5秒
rolling:true,//只要操作有响应 就会刷新这个时间 不然会总断
resave: false, //添加 resave 选项
saveUninitialized: true //添加 saveUninitialized 选项
}))

在登录路由上

router.post('/login',function(req,res,next)
{
var username = req.body.username;
var password = req.body.password;

db.query('select * from loginuser where username=? and password=?',[username,password],function(err,results)
{
if(err)
{
console.log(err);
}else if(results.length>0)
{
//自己定义is_login属性
req.session.is_login=true;
//界面转到index界面
res.render('sys_index.ejs',{username:results[0]['userName']});
}
})


})

在回到app.js

一定要注意位置 不然会引起问题

app.use(express.static(path.join(__dirname, 'public')));
//注意位置 要写在静态加载路径的下面 其他处理的上面
app.use(function(req,res,next)
{
if(req.session.is_login)
{
//往下执行
next();
}else if(req.url=='/'||req.url=='/login')
{
next();
}else
{
res.write("<script>parent.location.href='/'</script>")
}
})

效果

等路后 等5秒(设置了5秒)  再点击任何地方都会返回到登录界面

express 实现session_express_02

稳~

express 实现session_初始化_03