zoukankan      html  css  js  c++  java
  • 如何利用服务器下发的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脚本执行的。类似这样的一个脚本:

    双击代码全选

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    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

    本文出自 “ADC技术博客” 博客,请务必保留此出处http://virtualadc.blog.51cto.com/3027116/741435

  • 相关阅读:
    Filtering Approaches for Real-Time Anti-Aliasing(2011 SIGGRAPH)
    Rendering in UE4(Gnomon School UE4 大师课笔记)
    [转]Normal Map中的值, Tangent Space, 求算 Tangent 与 Binormal 与 TBN Matrix
    【第四章】语法分析
    【第三章】词法分析
    "随笔"列表
    查看Linux下库文件(a, so)中函数、变量
    [转]在Ubuntu 18.04系统上安装Systemback的方法
    [转]grep
    解决 Android 输出Logcat时报错[ read: unexpected EOF! ]
  • 原文地址:https://www.cnblogs.com/zhaochunhua/p/3569651.html
Copyright © 2011-2022 走看看