zoukankan      html  css  js  c++  java
  • expresssession使用理解

    本篇主要段落翻译来自https://github.com/expressjs/session

    客户端与服务会使用一个Sessionid的Cookie值来进行客户端和服务器端会话的匹配,这个Cookie一般是服务器端读/写的,并在Http请求响应的Header中的Set-Cookie属性设置:

    express-session是针对nodejs express框架提供的一套session扩展

    主要参数有 secret,sesave,saveUninitialized,cookie

    cookie主要属性如下,默认值 { path: '/', httpOnly: true, secure: false, maxAge: null }

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

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

    例子

    //获取当前时间
    var date=new Date();
    var expireDays=10;
    //将date设置为10天以后的时间
    date.setTime(date.getTime()+expireDays*24*3600*1000);
    //将userId和userName两个Cookie设置为10天后过期
    expires:date.toGMTString();
    

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

    maxAge:单位毫秒,从设置cookie开始多少毫秒失效 

    如果maxAge和expires都设置了,最后设置的属性生效.

    path:路径,默认值为域名的根路径.

    sameSite: SameSite-cookies是一种机制,用于定义cookie如何跨域发送。这是谷歌开发的一种安全机制,未来的一种cookie跨域授权处理方式,不明白的就不用设置了

    (Strict是最严格的防护,有能力阻止所有CSRF攻击。然而,它的用户友好性太差,因为它可能会将所有GET请求进行CSRF防护处理。

    例如:一个用户在reddit.com点击了一个链接(GET请求),这个链接是到facebook.com的,而假如facebook.com使用了Samesite-cookies并且将值设置为了Strict,那么用户将不能登陆Facebook.com,因为在Strict情况下,浏览器不允许将cookie从A域发送到B域。

    Lax(relax的缩写?)属性只会在使用危险HTTP方法发送跨域cookie的时候进行阻止,例如POST方式。

    例1:一个用户在reddit.com点击了一个链接(GET请求),这个链接是到facebook.com的,而假如facebook.com使用了Samesite-cookies并且将值设置为了Lax,那么用户可以正常登录facebok.com,因为浏览器允许将cookie从A域发送到B域。

    例2:一个用户在reddit.com提交了一个表单(POST请求),这个表单是提交到facebook.com的,而假如facebook.com使用了Samesite-cookies并且将值设置为了Lax,那么用户将不能正常登陆Facebook.com,因为浏览器不允许使用POST方式将cookie从A域发送到B域。

    )

    值true:sameSite使用strict模式

    值false:不设置sameSite属性

    值lax:sameSite使用lax模式

    值strict: sameSite使用strict模式

    secure:设置cookie的secure值,默认是不设置任何值

    setSecure(true); 的情况下,只有https才传递到服务器端。http是不会传递的。

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

    name :用来设置在response中范围session id是属性值,reuqest中可以用默认的request.session.id访问。默认值为connect.sid

        我用response['connect.sid'] 得不到值,同志仍须努力吧

    proxy:代理,通过设置这个值可以设置X-Forwarded-Proto 头,

        值有 true (X-Forwarded-Proto使用),false (所有头信息忽略,只有tls/ssl可以安全连接),undefined(使用trust proxy 设置) 具体大家研究,因为没有整代码大家继续努力实践

    resave:是否允许session重新设置,要保证session有操作的时候必须设置这个属性为true

    rolling:是否按照原设定的maxAge值重设session同步到cookie中,要保证session有操作的时候必须设置这个属性为true

    saveUninitialized:是否设置session在存储容器中可以给修改

      session过期30分钟,没有人操作时候session 30分钟后过期,如果有人操作,每次以当前时间为起点,使用原设定的maxAge重设session过期时间到30分钟只有这种业务场景必须同行设置resave rolling为true.同时saveUninitialized要设置为false允许修改。

    secret:用来注册session id 到cookie中,相当与一个密钥。

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

    unset:设置req.session在什么时候可以设置

      值:destory:请求结束时候session摧毁,值:keep session在存储中的值不变,在请求之间的修改将会忽略,而不保存

     方法

    req.session

    实现实例化

    app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))

    Session.regenerate()

    创建一个session  实例化之后会自动构建session,我暂时没有使用这个的场景

    req.session.regenerate(function(err) {
      // will have a new session here
    })

    Session.destroy()

    摧毁一个session,摧毁后会重新生成新的session 多个应用使用通一套session的时候慎用

    req.session.destroy(function(err) {
      // cannot access session here
    })
    

      

    Session.reload()

    session重新加载,暂时我没有碰到需要重新加载的情况

    req.session.reload(function(err) {
      // session updated
    })
    

      

    Session.save()

    手动保存一个session,要控制到权限的时候可用到

    req.session.save(function(err) {
      // session saved
    })
    

      

    req.session.id

     从request中获取sessionId

    req.session.cookie

     从request中获取session作为令牌的cookie值

    Cookie.maxAge

     req.session.cookie.maxAge,获取过期时间毫秒数

    req.sessionID

     只有在session loaded/created时候才可以读到,慎用。

    Session Store Implementation

    session store的诸多回调,session store必须是事件驱动的而且是具体方法才可以触发,因没有做相关store太多实践,不做太多说明

    store.all(callback) 

    返回一个存储store的数组

    store.destroy(sid, callback)

    在使用destory/delete 一个session时的回调

    store.clear(callback)

    delete 一个session时的回调

    store.length(callback)

    获取session的总长度在一个store中

    store.get(sid, callback)

    通过sessionid获取一个store事例对象

    store.set(sid, session, callback)

    自动生成一个sessionid或者调用save 一个session对象时候回调

    store.touch(sid, session, callback)

    使用touch更新session的时候回调

    因翻译水平和实践时间有限,欢迎大家对错误之处指出.thanks

  • 相关阅读:
    DockerCompose安装与快速体验
    Nginx:Docker部署与负载均衡开发实践
    JAVA基础:反射基础
    JVM:类加载机制
    JAVA基础:注解应用示例
    JAVA基础:注解机制
    JAVA并发(五):关键词final
    JAVA并发(四):关键词volatile
    Linux虚拟机配置作为旁挂路由器
    Linux起不来,如何修复
  • 原文地址:https://www.cnblogs.com/xiashan17/p/5897282.html
Copyright © 2011-2022 走看看