• 云时代架构阅读笔记六——会话管理


    原文链接:https://mp.weixin.qq.com/s/vN6qwITdbSWkWkJ_AymtPQ

    一、会话的必要性:客户跟踪

    Http协议是无状态协议,Web服务器没有短期记忆。在有些应用场景(例如:购物车)下,需要跨越多个请求识别同一个客户——客户跟踪,在Web应用中使用Cookie和Session可以做到这一点。

    使用HttpSession对象保存跨多个HTTP请求的会话状态。容器使用会话识别客户的原理为:(1)针对客户端的第一个请求,容器会生成一个唯一的会话ID,并通过响应把它返回给客户端;(2)客户端在这个会话以后的请求中都带上这个会话ID;(3)容器看到这个ID后,就会把这个会话与请求相关联。

    二、会话管理

    容器和客户端之间用什么方法交换会话ID信息? 

    1、利用Cookie交换会话信息

    2、httpOnly:如果设置为true,可以禁止客户端脚本使用该cookie,防止XSS攻击;

    3、可以设置cookie有效的域名、超时时间

    4、如果客户端(浏览器)禁用了cookie,就得使用URL重写来交换会话ID。

    5、如果客户端不能使用cookie,服务端必须给响应返回的URL进行编码,URL才可以起作用。

    6、使用encodeRedirectURL(),URL重写就是服务端返回的响应让客户点击一个链接,这个链接里带着会话ID; 

    7、静态页面无法自动完成URL重写。

    三、HttpSession的API

     getCreateTime():可以返回当前会话的创建时间,表示为ms数——即从1970-01-01 00:00:00开始经过的时间。

    1. getLastAccessedTime():可以返回上一次跟这个会话对应的客户发来请求的时间。

     setMaxInactiveInterval():设置当前会话的活跃时间,单位为秒,如果入参传0或负数,则表示当前会话永不过期。

    1. getMaxInactiveInterval():获取当前会话的活跃时间,单位为秒。
    2. invalidate():让当前的会话失效
    3. isNew():判断当前会话是否为新建的会话
    4. getAttribute(String):获取绑定在这个会话上指定name的属性的值。

     setAttribute(String, Object):将“key/value”指定的属性绑定到当前会话。

    1. removeAttribute(String):移除属性

    httpsession-api.png

    四、Cookie的API

     

    Cookie对象,response.setCookie()方法的入参是对象而不是kv对。Cookie中定义了如下几个关键属性:

     

     

    1. comment:用于描述cookie的作用
    2. domain:该cookie属于哪个域名
    3. maxAge:cookie的生命周期,以秒为单位
    4. path:指定该cookie对那种路径下的请求可见
    5. secure:如果该值为true,表示只有请求使用了HTTPS或SSL等安全协议时,才会携带cookie到服务端
    6. httpOnly:如果该值为true,则禁止客户端脚本发送的请求使用这个cookie。

    cookie最开始的设计目标是支持会话状态,不过也可以定制cookie来完成其他的工作,因为,cookie实际上是在客户端和服务器之间交换的一小段数据(key/value对)。

    从cookie中取数据,不能像map一样取,要遍历cookies数组,根据key值相同与否来挑选。这里有一段常用的cookie相关的常用代码:

     

     

    四、会话一致性管理

    在单体应用中,会话管理比较简单;在分布式应用中,会话管理比较复杂,常用的方案有以下几种:

    1. 会话同步:HttpSession对象(及其属性)支持从一个JVM迁移到另一个JVM;迁移动作包括:钝化、移动和激活。
    2. 定向会话:利用反向代理,让同一个用户的请求保证落在一台web-server上;这里又分为四层代理hash和七层代理hash,尽量使用四层代理hash,让专业的软件做专业的事情。

     

     

  • 相关阅读:
    习题10-2 递归求阶乘和(15 分)
    在过滤器中得到模型状态信息
    理解OAuth 2.0
    asp.net mvc 控制器的依赖注入(使用Ninject)
    web.routing 学习
    深度优先和广度优先的基础应用
    数的全排
    C# 表达式树
    C#中RSA的简单使用
    select into 和insert into select
  • 原文地址:https://www.cnblogs.com/DaisyYuanyq/p/11038877.html
Copyright © 2020-2023  润新知