开发者社区> 科技小能手> 正文

如何利用服务器下发的Cookie实现基于此Cookie的会话保持

简介:
+关注继续查看

   Cookie是一种在客户端保持HTTP状态信息的常用技术,基于Cookie的会话保持常常出现在很多AX的部署案例中,尤其是涉及电子交易的系统部署中。此类系统往往要求负载均衡设备按照服务器下发的Cookie值实现会话保持。大致的工作流程如下:

  1. 当客户进行第一次请求时,客户HTTP请求(不带cookie)发送到负载均衡设备, 负载均衡设备根据负载均衡算法策略选择后端一台服务器,并将请求发送至该服务器,后端服务器在HTTP回复的Header中执行set-cookie的动作,将包含服务器端cookie的回复数据包发回负载均衡设备;
  2. 负载均衡设备会根据服务器回复的Cookie值,在自身会话保持表中查询,如果表中没有相同的Cookie值记录,那么将此Cookie值作为会话保持的“Key”值,将此次会话添加到会话保持表中;并将带有服务器插入cookie值的HTTP回复返回到客户端;
  3. 当客户请求再次发生时,客户将带有上次服务器cookie的HTTP请求发送到负载均衡设备,之后负载均衡设备根据会话保持表中该cookie值的会话保持记录,将HTTP请求(带有与上面同样的cookie)发到会话保持中表记录的服务器;
  4. 后端服务器进行请求回复。
  5. 如此循环,只要在会话保持表中的空闲保持时间(Age)递减到0之前,客户端发送带有相同Cookie值的HTTP请求,负载均衡设备始终会将这些请求分配到相同的服务器上。

        AX设备实现此功能目前是通过一个比较简单的aFlex脚本执行的。类似这样的一个脚本:

when HTTP_REQUEST {                                       ##当发生HTTP请求事件时 
  set key ""                                                               ##设置变量“key”值为空 
  if { [HTTP::cookie exists "JSESSIONID"] } {                           

##判断HTTP header中是否有名为“JSESSIONID”的Cookie 
     set key [HTTP::cookie "JSESSIONID"]                               

##如果有此Cookie,将其值赋予变量”key”中 
     persist uie $key 300                                                             

##并按照此变量值执行persist uie的会话保持动作,会话保持的空闲超时时间(age)为300秒 
  }  else { 
     set key [IP::remote_addr]                                                    

##如果HTTP header中没有名为“JSESSIONID”的Cookie,则将客户端源IP赋予变量“key” 
     persist uie $key 300                                     ##按照源IP地址执行会话保持 
  } 

when HTTP_RESPONSE {                                                 

##当发生HTTP应答事件时(即接收到服务器的应答请求时) 
  if { $key ne "" } {                                                   ##如果变量"key”值不为空 
     set p [ persist lookup uie $key ]                                         

##则在会话保持表中查询是否已存在该"key”值的会话保持记录,并将返回结果保存在变量“P”中 
     if { $p eq "" } {                                                                        

##如果该变量值为空,即会话保持表中没有查询到该"key”值的会话保持记录                                                     
         persist add uie $key 300                                                 

##将该"key”值,即将包含此Cookie值的会话添加到会话保持表中 
     } 
  } 
}

        在不同的应用场景,我们可以根据应用服务器下发的不同名称的Cookie来执行会话保持,只需要修改脚本中的判断条件,在HTTP header中判断是否存在对应的Cookie,从而以此Cookie执行会话保持。

S.G


本文转自 virtualadc 51CTO博客,原文链接:http://blog.51cto.com/virtualadc/741435

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Qt+QtWebApp开发笔记(四):http服务器使用Session和Cookie实现用户密码登录和注销功能
前面实现了基础的跳转,那么动态交互中登录是常用功能。本篇实现一个动态交互的简单登录和注销功能,在Qt中使用Session和Cookie技术。
21 0
面试项目说实现了一个后端多线程网络服务器框架应该怎样写
面试项目说实现了一个后端多线程网络服务器框架应该怎样写
54 0
树莓派公网服务器实现frp内网穿透
树莓派公网服务器实现frp内网穿透
122 0
自建内网穿透服务器替换TeamViewer和向日葵,实现远程控制
自建内网穿透服务器替换TeamViewer和向日葵,实现远程控制
159 0
分布式服务器框架之Servers.Core库实现 DES对称加密算法;SHA1信息摘要算法;MD5信息摘要算法
通信双方(通信主体)同时掌握一个钥匙,加解密都由这一个钥匙完成。通信双方通信前共同拟定一个密钥,不向第三方公开,发送前加密和接受后解密都由此密钥完成。即钥匙如果泄露,将暴露自己的全部信息。
83 0
分布式服务器框架之Server.Core库中实现 XXTEA分组加密算法
在密码学中,微型加密算法(Tiny Encryption Algorithm,TEA)是一种易于描述和执行的块密码,通常只需要很少的代码就可实现。其设计者是剑桥大学计算机实验室的大卫·惠勒与罗杰·尼达姆。这项技术最初于1994年提交给鲁汶的快速软件加密的研讨会上,并在该研讨会上演讲中首次发表。
34 0
分布式服务器框架之Servers.Core中 实现Log模块设计 写入MongoDB数据库
游戏服务器中都需要用到Log模块,log模块存在的意义第一个是将log输出到控制台又或者是写入到log文件中,出了BUG方便定位;第二是常用于将用户的数据(例如玩家登录、道具购买量)将这种log统计到数据库中,方便统计用户留存信息、数据分析等。
39 0
分布式服务器框架之Server.Common库中实现 秒级定时器
定时器模块是服务器中的常用组件,本文带你实现一个具有基本功能的定时器模块要想设计一个定时器模块,一般包含两部分,一个是定时器对象(ServerTimer),另一个管理定时器对象的管理者(TimerManager)也叫定时器容器;定时器使用了C#内System库里面的Timer定时器作为定时器的主驱动
32 0
分布式服务器框架之Server.Core库中实现YFUniqueEntity、YFUniqueIDBase 管理MongoDB 自定义Id的自增
YFUniqueEntity是数据库中的结构,GetUniqueID函数中会根据Type和自增步长去数据库中寻找该类型的当前ID是多少,然后会用当前的Id去加上步长,把更新后的新ID插入到MongoDB中记录着ID的那张表里。
31 0
分布式服务器框架之Servers.Core库中实现 MongoEntityBase 实现阻塞 异步对MongoDB的增删改查
YFMongoDBModelBase类是个模板类,对模板参数进行了约束YFMongoEntityBase,必须要继承YFMongoEntityBase
43 0
+关注
科技小能手
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
函数计算事件驱动的无服务器计算服务
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载