zoukankan      html  css  js  c++  java
  • Cookie和Session的使用详解

    我们在使用接口请求时经常听到Cookie和Session的知识,那么它们的实际意义和使用场景在哪里呢 ?    介绍如下

    一、首先需要了解的是为什么需要有Cookie和Session这两个东西:Http是无状态协议,Cookie和Session的引入就是为了进行状态管理。

      Cookie的产生:由服务端生成,存储在响应头中,返回给客户端,客户端会将cookie存储下来

      Session的产生:由服务端生成,存储在服务器端的内存、缓存、数据库等地方

    二、服务请求的传递过程

      在客户端发送请求时,user-agent会自动获取本地存储的cookie,将cookie信息存储在请求头中,发送给服务端。

      那么问题就出现了,请求都是由客户端发起的,当服务端生成了session,客户端怎么会知道呢?客户端怎么能对上这个session暗号?

      整个传递过程如下:

      1、在客户端给服务端发送请求后,服务端会根据请求信息生成session,同时生成一个session_id,通过cookie返回给客户端

      2、客户端再次向服务端发送请求时,会通过cookie将这个session_id发送给服务端,这样就对上了session的暗号

    验证程序代码如下:

    # -*- coding: utf-8 -*-
    import requests
    # 登录数据
    login_url='http://119.23.241.154:8080/futureloan/mvc/api/member/login'
    login_data={'mobilephone':'17688773467','pwd':'123456'}
    # 充值数据
    recharge_url = 'http://119.23.241.154:8080/futureloan/mvc/api/member/recharge'
    recharge_data = {'mobilephone':'17688773467','amount':'1000'}
    
    # -------------------------------------------以下是cookie的方式----------------------------------------------------
    # 登录请求
    response_log = requests.get(login_url, login_data)
    res_login = response_log.json()          # 返回结果转换json格式
    cookies_log = response_log.cookies.get_dict()  # 获取Cookie的字典格式
    print('登录结果是{0}'.format(res_login))
    print('登录产生的cookie是{0}'.format(cookies_log))
    print('JSESSIONID:{0}'.format(cookies_log['JSESSIONID']))

    运行结果如下:

    1、登录成功后才会产生cookie

    2、你要获取cookie就要从响应结果response里面去获取

    3、cookie类似于字典格式,可以用key取value的值

    然后第二个“充值”接口是需要依赖登陆cookie的,如果不传递cookie值结果如下

    # -*- coding: utf-8 -*-
    import requests
    # 登录数据
    login_url='http://119.23.241.154:8080/futureloan/mvc/api/member/login'
    login_data={'mobilephone':'17688773467','pwd':'123456'}
    # 充值数据
    recharge_url = 'http://119.23.241.154:8080/futureloan/mvc/api/member/recharge'
    recharge_data = {'mobilephone':'17688773467','amount':'1000'}
    
    # -------------------------------------------以下是cookie的方式----------------------------------------------------
    # 登录请求
    response_log = requests.get(login_url, login_data)
    res_login = response_log.json()          # 返回结果转换json格式
    cookies_log = response_log.cookies.get_dict()  # 获取Cookie的字典格式
    # print('登录结果是{0}'.format(res_login))
    # print('登录产生的cookie是{0}'.format(cookies_log))
    # print('JSESSIONID:{0}'.format(cookies_log['JSESSIONID']))
    # print('登录产生的cookie是{0}'.format(cookies_log.get_dict()))
    # #1、登录成功后才会产生cookie  2、你要获取cookie就要从响应结果response里面去获取 3、cookie类似于字典格式,可以用key取value的值
    #
    #  ==========充值请求==============
    # # 如果不加cookie 会一直显示{'data': None, 'status': 0, 'code': None, 'msg': '抱歉,请先登录。'}
    # res_recharge = requests.post(recharge_url, recharge_data, cookies=cookies_log).json() # cookies=cookies关键字参数  key=values,如果是headers就headers=values
    res_recharge = requests.post(recharge_url, recharge_data).json()    # 无cookie传递的情况
    
    print('充值结果是{0}'.format(res_recharge))

    结果如下 :

    提示需要先登陆 

    加上cookie信息后(加cookie的方式参照我注释的倒数第三行),可以正常返回充值信息:

    三、会话对象session

    会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。

    session会自动管理cookie,一个session对象会保持同一个会话中的所有请求之间的cookie信息

    验证代码如下,当我们不实用cookie,直接使用session时也能保持登录

    import requests
    # 登录数据
    login_url='http://119.23.241.154:8080/futureloan/mvc/api/member/login'
    login_data={'mobilephone': '17688773467', 'pwd': '123456'}
    # 充值数据
    recharge_url = 'http://119.23.241.154:8080/futureloan/mvc/api/member/recharge'
    recharge_data = {'mobilephone': '17688773467', 'amount': '1000'}
    s = requests.session()  # 产生一个会话,无直接进行cookie传递
    res_login2 = s.get(login_url, params=login_data).json()  # 登录在这个会话下发起get请求 get只能传一个参数, def get(self, url, **kwargs):
    res_recharge2 = s.post(recharge_url, recharge_data).json()  # 充值在这个会话下发起post请求
    print('登录结果是{0}'.format(res_login2))
    print('充值结果是{0}'.format(res_recharge2))

    运行结果如下:

    均能正常返回结果。  

    总结

    1、状态处理:每次请求服务器都要校验你的状态 通过cookie seeion校验

    2、cookie 存在本地

       seeion 存在服务器 会话的意思

    3、每次提交请求的时候 会随带cookie 发送至服务器 检查会话是否已过期

    4、当你在同一个会话下面 你可以直接请求

    5、会话对象session比cookies更方便管理请求的cookie信息

  • 相关阅读:
    poj 2488 DFS
    畅通工程 并查集模版
    KMP 模板
    poj 1426 DFS
    poj 2528 线段数
    poj 3468 线段数 修改区间(点)
    CVPR2012文章阅读(2)A Unified Approach to Salient Object Detection via Low Rank Matrix Recovery
    如何制定目标
    Saliency Map 最新综述
    计算机视觉模式识别重要会议杂志
  • 原文地址:https://www.cnblogs.com/jsondai/p/9669084.html
Copyright © 2011-2022 走看看