express 实现session

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 }
domaincookie可以设置的域名,如果没有设置则cookie默认在当前域可以使用
expirescookie失效时间,可以设置时间,不建议给固定时间,设置maxAge之后自动会生成这个值
httpOnly属性禁止客户端JavaScript的访问,禁止后不能使用document.cookie
maxAge设置cookie开始多少毫秒失效
path默认值为域名的根路径
securetruehttps才传递到服务器端。http是不会传递的
genid设置创建session id的自定义函数,默认使用 uid-safe扩展来生成id,一定要保证创建的id不要重复。
nameresponsesessionID这个cookie的名称 ,即set-cookiesessionIDkey,看一下源码片段: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到cookie中,相当与一个密钥
storesession存储的实例子,一般可以用redismangodb来实现
unset默认是keep ,设置req.session在什么时候可以设置。 destory:请求结束时候session摧毁,keep: session在存储中的值不变,在请求之间的修改将会忽略,而不保存 。

3)express session的使用

npm install 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秒)  再点击任何地方都会返回到登录界面

稳~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小慧哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值