• 四十九、cookie与session


    一 cookie

    cookie就是保存在客户端上的和用户相关的状态信息,是一组组键值对。

    特性:

    1. 由服务器让浏览器进行设置。
    2. cookie信息保存在浏览器本地,所以浏览器有权不保存。
    3. 浏览器再次访问时自动携带对应的cookie。

    为什么要使用cookie?
    Http协议是无状态协议,每次请求之间都是相互独立的,没有办法保存状态,所以使用cookie保存状态。

    Django中操作cookie

    • 设置cookie
      # 获取一个HttpResponce对象
      res_obj = HttpResponce('cookie test')
      # 设置cookie
      # 方式一:
      res_obj.set_cookie(key="name", value="jasper")
      # def set_cookie(
      #         self,
      #         key,
      #         value="",
      #         max_age=None,
      #         expires=None,
      #         path="/",
      #         domain=None,
      #         secure=False,
      #         httponly=False,
      #         samesite=None,
      # ):
      
      # 方式二:
      # res_obj.set_signed_cookie(key='info', value='shanghai', salt='加密')
      # def set_signed_cookie(self, key, value, salt="", **kwargs):
      
      return res_obj
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
    • 获取cookie
      request.COOKIE  # 字典数据格式 获取普通cookie
      request.get_signed_cookie(key="info", salt="加密")  # 获取加密的cookie
      
      • 1
      • 2
    • 删除cookie
      res_obj.delete_cookie(key="info")
      
      • 1

    登录认证装饰器

    def login_auth(func_name):
    	# 被装饰对象真正执行
        def inner(request, *args, **kwargs):
        	# 判断是否已经登录 
            if request.COOKIES.get('is_login') == '1':
                res = func_name(request, *args, **kwargs)
                return res
            # 未登录就将跳转到登陆界面 并在后面携带登陆成功后跳转的路径
            else:
                path = f'login/?next={request.path_info}'
                print(path)
                return redirect(to=f'http://127.0.0.1:8000/{path}')
        return inner
    
    
    def home(request):
        return render(request, 'home.html')
    
    
    @login_auth
    def index(request):
        return render(request, 'index.html')
    
    
    @login_auth
    def func(request):
        return render(request, 'func.html')
    
    
    def login(request):
        if request.method == 'POST':
            # print(request.POST)
            if request.POST.get('username') == 'jasper' and request.POST.get('password') == '123':
            	# 登陆成功后 判断后缀是否有值
                if request.GET.get('next'):
                	# 有值则跳到后缀所在的地址
                    res_obj = redirect(to=f"http://127.0.0.1:8000{request.GET.get('next')}")
                else:
                	# 没携带后缀就跳转到home界面
                    res_obj = redirect(to="http://127.0.0.1:8000/home/")
                # 第一次登陆成功设置cookie值
                res_obj.set_cookie(key='is_login', value='1')
                return res_obj
        print(request.GET)
        return render(request, 'login.html')
    
    • 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
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    二 session

    cookie可以验证状态,但是cookie键值对在浏览器中是可见的,而session在浏览器发出登录请求时,随机设置一个cookie值返回给浏览器,这个随机字符串叫做session_id,同时会把你请求带来的数据(session_data)一起作为键值对存储在本地数据库中(django_session表中),下次浏览器带着session_id来时,去库中查找即可。

    **特点:**保存在服务器上的一组组键值对,依赖cookie使用。

    为什么要使用session?

    • cookie是将用户数据保存在浏览器啊中,不太安全。
    • 浏览器对cookie的大小和个数有限制。

    过程:

    1. 第一次请求,没有cookie,设置键值对,根据浏览器生成一个唯一标识,给一个字典设置键值队。
    2. 字典转成字符串,进行加密,将唯一标识和字符串保存在数据库中(django_session)。
    3. 返回唯一标识给浏览器(session_id)的cookie。
    4. 下次请求携带session_id,服务器根据session找到对应的数据(session_data)进行解密,根据key获取对应的值。

    工作流程:

    1. 当用户来访问服务端时,服务端会生成一个随机字符串。
    2. 当用户 登陆成功后,把{session_id: 随机字符串}组织成字典的形式发送给浏览器,浏览器保存用户信息。
    3. 当再次访问时,浏览器会带着session_id,服务器根据session_id来确认用户是否已经登录过。

    session的默认过期时间是两周

    session的相关方法

    # 设置session
    request.session[key] = value
    
    # 获取
    request.session.get(key)
    
    # 删除
    del request.session[key]  request.session.pop(key)
    
    # 会话session的key
    request.session.session_key  # aqdk9wtdbyudbf373jpqws1kmqgulp3d
    
    # 将所有日期失效的session删除
    request.session.clear_expired()
    
    # 判断session中的key是否存在
    request.session.exists("session_key")
    
    # 删除当前会话的所有session
    request.session.delete()
    
    # 删除当前的会话数据并删除会话的Cookie。
    request.session.flush()
    
    # 设置session和cookie的超时时间
    request.session.set_expiry(value)
    #如果value是个整数,session会在些秒数后失效。
    # 如果value是个datatime或timedelta,session就会在这个时间后失效。
    # 如果value是0,用户关闭浏览器session就会失效。
    # 如果value是None,session会依赖全局session失效策略
    
    • 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

    session实现登录认证功能

    def login_auth(func_name):
        def inner(request, *args, **kwargs):
            session = request.session.get('is_login')
            if session == '1':
                res = func_name(request, *args, **kwargs)
                return res
            else:
                path = request.path_info
                print(path)
                return redirect(to=f"http://127.0.0.1:8000/login/?next={path}")
    
        return inner
    
    
    def login(request):
        if request.method == 'POST':
            if request.POST.get('username') and request.POST.get('password'):
                request.session['is_login'] = '1'
                fix = request.GET.get('next')
                print(fix)
                if fix:
                    path = f"http://127.0.0.1:8000{fix}"
                else:
                    path = f"http://127.0.0.1:8000/home/"
                return redirect(to=path)
    
        return render(request, 'login.html')
    
    
    def home(request):
        return render(request, 'home.html')
    
    
    @login_auth
    def index(request):
        return render(request, 'index.html')
    
    
    @login_auth
    def func(request):
        return render(request, 'func.html')
    
    • 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
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    三 cookie与session的联系与区别

    • 区别
      cookie将数据存在客户端,而session将数据存放在服务端。
      cookie相对于session来说不安全。
      cookie在客户端存储有大小限制,session没有。
    • 联系
      session基于cookie
  • 相关阅读:
    微信公众号开发:网页授权
    notepad++下载地址
    RestClient Java客户端
    数据结构-非线性结构-集合-树(一般树-二叉树)-图(有向图、无向图)
    贪心算法 Problem D 1003 哈夫曼编码
    实验一 熟悉OpenCV环境和基本操作
    openssl生成key和pem文件
    mysql中的数据类型
    计算机网络-DNS和HTTPDNS了解
    【Python21天学习挑战赛】-爬虫(B站)程序示例
  • 原文地址:https://blog.csdn.net/weixin_68531269/article/details/126832316