• 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信息

  • 相关阅读:
    在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个。必须提供所有成员。 (microsoft.sqlserver.smo)
    Mysql的Root密码忘记,查看或修改的解决方法
    Win7系统如何设置FTP详细过程
    该设备或资源(127.0.0.1)未设置为接受端口“16823”上的连接。
    window7防火墙无法更改某些设置,错误代码0×80070422
    访问FTP站点下载文件,提示“当前的安全设置不允许从该位置下载文件”的解决方案
    解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的方法
    按状态选择链接元素
    类选择器与ID选择器的比较
    关于创建Web图像时应记住的五个要素
  • 原文地址:https://www.cnblogs.com/jsondai/p/9669084.html
Copyright © 2020-2023  润新知