zoukankan      html  css  js  c++  java
  • cookie and session

    简介

    HTTP协议 是短连接、且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态;

    cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录;

    参数介绍

    1、max_age=1 :cookie生效的时间,单位是秒

    2、expires:具体过期日期  

    3、path='/':指定那个url可以访问到cookie;‘/’是所有; path='/'

    4、domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie

    5、secure=False:https安全相关

    6、httponly=False:限制只能通过http传输,JS无法在传输中获取和修改

    设置cookie

    1.普通

    response = HttpResponseRedirect('一句话') # 返回客户端一句话
    response = redirect('/user/login/')  # 重镜像到当前url
    response =render(request, 'user/changes_pwd.html', content)  # 返回前端模板
    response.set_cookie("tile","zhangyan",expires=value,path='/' )
    response.set_cookie('name',zhangyan, expires=datetime.datetime.now() + datetime.timedelta(days=14))

    return response

    2.加盐(加签名,防止没篡改)

    普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看

    response = HttpResponseRedirect('一句话') # 返回客户端一句话
    response = redirect('/user/login/')  # 重镜像到当前url
    response =render(request, 'user/changes_pwd.html', content)  # 返回前端模板
    response.set_signed_cookie('k','v',salt="zhangyan")
    response.set_signed_cookie('k', 'v', 'name'=zhangyan, expires=datetime.datetime.now() + datetime.timedelta(days=14))

    return response

      

     

    获取cookie

    1、普通

    cookise = request.COOKIES.get('k', '默认值')
    cookise = requese.COOKIES.get('name', ',默认值')
    cookies = request.COOKIES.has_key('uname') # 判断cookie中是否有这个值
    

      

    2、加盐(加签名,防止没篡改)

    cookies=request.get_signed_cookie('k',salt='zhanggen')
    cookies=request.get_signed_cookie('k',name='zhanggen')
    cookies=request.COOKIES.has_key('uname') # 判断cookie中是否有这个值

      

      

    删除cookie

    response.delete_cookie('uname')

    return response

      

    二、cookie+session

    1、cookie引入session:

    cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患,

    于是cookie+session出现了!我们可以 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串),

    基于以上原因:cook+session组合就此作古了单单使用cookie做会话保持的方式;

    2、cookie+session的工作流程:

    (1)、当用户来访问服务端时,服务端生成一个随机字符串;

    (2)、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对 加到 cookie里发送给用户;

    (3)、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;

    3、保存在服务端session数据格式

    {

     随机字符串                                        用户信息

    傻狍子的随机字符串:        {id:1,nam:"alex",account:1000000000 },

    二狗子的随机字符串:        {id:1,nam:"eric",account:10}

     

     注意:request.session['name']=‘alex’,request.session默认隐含了通过sessionID找到用户信息那一步;

    所以现在设置的是用户信息的键(name)和用户信息的值(alex),删除也是如此!

    4、最终得出结论了!!!

    session的应用 要依赖于cookie:(session就是 cookie的变种)

    (1)每次用户第一次访问服务端, 把用户的唯一字符串 session_id加到cookie里面,发送给客户端;

    (2)服务器端保存 随机字符串(sessionID:{用户信息})服务端

     

    (3)下次来通过 cookie中的sessionID(键)获取用户信息值(值)

    session作用:

    会话保持,记住用户的登录状态(WEB网站,分布式架构)

    作用(和cookie的区别)

    避免了敏感信息保存在客户端,防止客户端修改cookie信息!

    设置session

    request.session['email'] = '1064145110@qq.com'  # 设置session
    request.session.setdefault('name',123) # 存在则不设置
    request.session.set_expiry(value)    #设置session超时时间,默认2周
    request.session.exists("session_key")  # 检查 用户session的随机字符串 在数据库中是否
    

      

    获取session

    request.session.get('name',None)  # 这样取值的不报错,没有拿None
    request.session.has_key('name')  # 判断session中是否有name
    request.session.keys()  # 提取所有键
    request.session.values()    # 提取所有值
    request.session.iterkeys()  # 迭代键
    request.session.itervalues()    # 迭代值
    request.session.iteritems() # 迭代键值
    

      

    删除session

    request.session.delete("name")  # 删除session 
    request.session.flush()   # 清除会话数据,在存储中删除会话的整条数据
    request.session.clear()   #清除用户的所有session数据,用于注销
    request.session.clear_expired()     # 清除所有已超过自身设定超时时间的session
    

      

    存储方式

    • 存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式
    SESSION_ENGINE='django.contrib.sessions.backends.db'
    • 存储在缓存中:存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快
    SESSION_ENGINE='django.contrib.sessions.backends.cache'
    • 混合存储:优先从本机内存中存取,如果没有则从数据库中存取
    SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
    

      

    设置setting.py

    SESSION_COOKIE_NAME = "sessionid"      # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"              # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False          # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True         # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False    # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False        # 是否每次请求都保存Session,默认修改之后才保存(默认)
    

      

    使用Redis存储Session

    将服务器端的session信息保存到数据库的相关配置

    • 安装包。
      pip install django-redis-sessions
    • 修改settings文件,增加如下项:
      SESSION_ENGINE = 'redis_sessions.session'   
      SESSION_REDIS_HOST = 'localhost'
      SESSION_REDIS_PORT = 6379
      SESSION_REDIS_DB = 2
      SESSION_REDIS_PASSWORD = ''
      SESSION_REDIS_PREFIX = 'session'’
      

        

  • 相关阅读:
    css实现鼠标悬浮字体流光背景模糊效果
    原生JS实现省市区(县)三级联动选择
    多线程的对象锁和类锁
    session、cookie与“记住我的登录状态”的功能的实现
    Java NIO FileVisitor 高效删除文件
    mysql 服务启动失败
    Http 协议详解
    设计模式 之 策略模式
    简单探讨 javascript 闭包
    数据库SQL优化大总结之 百万级数据库优化方案
  • 原文地址:https://www.cnblogs.com/yoyo1216/p/10232071.html
Copyright © 2011-2022 走看看