zoukankan      html  css  js  c++  java
  • 关于http连接的本质 已经cookies和session

    网络上的任何交互都是基于socket连接

    http  连接响应 close  再次连接 无法确实是否还是xx的连接——无状态,短连接

    以博客园举例 无状态和短连接:

    for example:

        

    Web应用(网站):

    浏览器(socket客户端)运行

    2.发送请求

    博客园为例子 socket服务端)

    1. 监听自己的ip和端口    { cmdPing+网址可在终端拿到(ip)  }

    While Ture

    3.收到 请求

    4.响应

    用户断开

    #################################################

    关于cookies和session的总结(ps:不是很全)

    1. http协议的无状态性:

    使用cookie:
    第一次向服务器发起请求,服务器返回一个cookie给客户端,
    客户端存储cookie,当客户端再次发起请求时携带cookie信息给服务器,
    服务器接收到cookie信息能够获取用户信息

    不使用cookie:
    第一次向服务器发起请求,服务器返回一个响应给客户端
    第二次再次向服务器发起请求,服务器仍然不知道是哪一个用户发起的请求

    2. 使用cookie可以弥补这种http请求的无状态性

    1. 客户端发起请求(包含用户信息),服务器接收到请求,验证用户信息,同时返回响应给客户端(携带cookie)

    2. 客户端接收响应(存储cookie)

    3. 客户端再次发起请求就会携带cookie信息,服务器就能知道是哪个用户发起的请求了

    【注意】:
    1. cookie不能跨域传递
    2. 使用cookie存储数据的容量是有限的, 不能使用cookie存储大量文本信息。
    一般来说用cookie存储用户名, sessionid
    不同的浏览器, cookie容量不同,最大不会超过4kb


    3. 在django中操作cookie

    1. 设置cookie

    p = HttpResponse()
    p.set_cookie(key, value) # 默认过期时间: 浏览器关闭时,不是标签页关闭
    p.set_cookie(key, value, max_age=60) # 单位是秒, 设置过期时间

    from django.utils.timezone import make_aware

    带时区的时间日期对象 = make_aware(时间日期对象)
    p.set_cookie(key, value, expires=时间日期对象(带时区))

    * 如果同时设置了max_age和expires, 则使用expires的过期时间

    2. 删除cookie

    p = HttpResponse()
    p.delete_cookie('name')

    3. 获取cookie

    request.COOKIES.get('name')
    POST
    GET
    FILES

    PS:(
    cookie是保存在客户端的(浏览器)
    cookie在客户端中分域名保存
    发起请求时客户端自动将当前域名(路劲)下未过期的cookie携带上

    4. session

    1. 基于cookie实现

    2. 过程:

    1. 客户端发起请求(用户信息), 服务器接收到请求,
    验证通过, 将用户信息加密后存储到session表中,对应着随机生成的session_id

    2. 服务器返回响应, 携带cookie, cookie中存储的是session_id

    3. 客户端接收到响应, 存储cookie信息到本地浏览器中

    4. 客户端再次发起请求, 携带cookie信息(session_id),
    服务器接收到请求后,通过session_id就能获取用户信息


    注意: cookie存储在客户端(浏览器)
    session存储在服务器

    5. 在django中操作session

    1. 存储:

    request.session['key'] = 'value'

    同一个用户,创建多个session键值对,在django_session表中只存储为一条session数据;
    session表中的session_key是固定的。

    2. 获取:

    request.session[]
    request.session.get()
    request.session.items()
    request.session.keys()
    request.session.values()

    3. 删除:

    request.session.pop('key')

    4. 清除数据:

    request.session.clear() # 清除当前用户存储的session键值对,session表中的session数据还在
    cookie中仍然有session_id的值

    request.session.flush() # 注销;退出登录;
    在session表中删除当前用户的整条session数据,
    cookie中的session_id也被删除了

    * 同一个客户端的同一个用户也可能会产生多条session表中的数据,因为之前的数据都过期了

    5. 删除过期的session

    1. 代码 request.session.clear_expired()

    2. 命令行 python manage.py clearsessions

    6. 设置过期时间

    request.session.set_expiry()

    1. 整型参数: 秒
    2. 0:浏览器关闭
    3. None:默认的过期时间,2周

    settings.py

    TIME_ZONE = 'Asia/Shanghai'
    USE_TZ = False

  • 相关阅读:
    阿里消息队列中间件 RocketMQ 源码分析 —— Message 拉取与消费(上)
    数据库中间件 ShardingJDBC 源码分析 —— SQL 解析(三)之查询SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(六)之删除SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(五)之更新SQL
    消息队列中间件 RocketMQ 源码分析 —— Message 存储
    源码圈 300 胖友的书单整理
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(一)分库分表配置
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(四)之插入SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(二)之分库分表路由
    C#中Math类的用法
  • 原文地址:https://www.cnblogs.com/pythonyeyu/p/10393677.html
Copyright © 2011-2022 走看看