前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >会话管理

会话管理

作者头像
阿杜
发布2018-08-06 11:14:42
1.4K0
发布2018-08-06 11:14:42
举报
文章被收录于专栏:阿杜的世界阿杜的世界

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

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

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

二、会话管理

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

  1. 利用Cookie交换会话信息
  • httpOnly:如果设置为true,可以禁止客户端脚本使用该cookie,防止XSS攻击;
  • 可以设置cookie有效的域名、超时时间
  1. 如果客户端(浏览器)禁用了cookie,就得使用URL重写来交换会话ID。
  • 如果客户端不能使用cookie,服务端必须给响应返回的URL进行编码,URL才可以起作用。
  • 使用encodeRedirectURL(),URL重写就是服务端返回的响应让客户点击一个链接,这个链接里带着会话ID;
  • 静态页面无法自动完成URL重写。

三、HttpSession的API

  1. getCreateTime():可以返回当前会话的创建时间,表示为ms数——即从1970-01-01 00:00:00开始经过的时间。
  2. getLastAccessedTime():可以返回上一次跟这个会话对应的客户发来请求的时间。
  3. setMaxInactiveInterval():设置当前会话的活跃时间,单位为秒,如果入参传0或负数,则表示当前会话永不过期。
  4. getMaxInactiveInterval():获取当前会话的活跃时间,单位为秒。
  5. invalidate():让当前的会话失效
  6. isNew():判断当前会话是否为新建的会话
  7. getAttribute(String):获取绑定在这个会话上指定name的属性的值。
  8. setAttribute(String, Object):将“key/value”指定的属性绑定到当前会话。
  9. removeAttribute(String):移除属性

httpsession-api.png

四、Cookie的API

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

代码语言:javascript
复制
    private String comment; // ;Comment=VALUE ... describes cookie's use
    private String domain; // ;Domain=VALUE ... domain that sees cookie
    private int maxAge = -1; // ;Max-Age=VALUE ... cookies auto-expire
    private String path; // ;Path=VALUE ... URLs that see the cookie
    private boolean secure; // ;Secure ... e.g. use SSL
    private boolean httpOnly; // Not in cookie specs, but supported by browsers
  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相关的常用代码:

代码语言:javascript
复制
    public String getCookieValueFromReq(String key, Cookie[] cookies) {
        String value = "";
        try {
            if (null != cookies) {
                for (Cookie cookie : cookies) {
                    if (cookie.getName().equalsIgnoreCase(key)) {
                        value = URLDecoder.decode(cookie.getValue(), "UTF-8");
                    }

                }
            }
            return value;
        } catch (Exception e) {
            logger.error("获取cookie异常", e);
        }
        return "";
    }

四、会话一致性管理

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

  1. 会话同步:HttpSession对象(及其属性)支持从一个JVM迁移到另一个JVM;迁移动作包括:钝化、移动和激活。
  2. 定向会话:利用反向代理,让同一个用户的请求保证落在一台web-server上;这里又分为四层代理hash和七层代理hash,尽量使用四层代理hash,让专业的软件做专业的事情。
  3. 客户端存储:session存储在浏览器cookie中,每个客户端只存储自己的用户,但是有缺陷:每次http请求都需要携带session——占用带宽、存在安全隐患、session存储的数据大小受cookie限制;
  4. 后端统一存储:将会话存放在分布式缓存中或数据库中。

参考资料

  1. Head First Servlets & JSP
  2. session一致性架构设计实践
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.06.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、会话的必要性:客户跟踪
  • 二、会话管理
  • 三、HttpSession的API
  • 四、Cookie的API
  • 四、会话一致性管理
  • 参考资料
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档