一、 cookie

  1. 定义:保存在浏览器本地上的一组组键值对

  2. 特点:

    • 由服务器让浏览器进行设置的
    • 浏览器保存在浏览器本地
    • 下次访问时自动携带
  3. 应用:

    • 登录
    • 保存浏览习惯
    • 简单的投票
  4. 使用cookie的原因:因为HTTP是无状态的,用cookie来保存状态

  5. 在django中操作cookie

    • 设置cookie:

      # HttpResponse,render也可以
      ret = redirect('/index')
      ret.set_cookie('key',value,...) # Set-Cookie:key=value
      ret.set_signed_cookie('key',value,salt='加密盐',...)
      • 参数:

        • key,键
        • value='',值
        • max_age=None,超出时间
        • expires=None,超出时间(针对于IE浏览器)
        • path='/',cookie生效的路径,/表示根路径
        • domain=None,cookie生效的域名
        • secure=False,https传输
        • httponly=False,只能http协议传输,无法被JavaScript获取
    • 获取cookie:

      request.COOKIES.get('key')
      request.get_signed_cookie('key',salt='加密盐',default=RAISE_ERROR,max_age=None)
      • 参数:

        • default:默认值
        • salt:加密盐
        • max_age:后台控制过期时间
      • 注意:获取时的加密盐要和设置时的加密盐相同,否则无法获取到正确的数据
    • 删除cookie:

      def logout(request):
      ret = redirect("/login/")
      ret.delete_cookie("key") # 删除用户浏览器上之前设置的cookie值
      return rep
  6. cookie版登陆校验

    from django.shortcuts import render, redirect, HttpResponse
    from django.views import View class Login(View):
    def get(self, request, *args, **kwargs):
    return render(request, 'login.html') def post(self, request, *args, **kwargs):
    username = request.POST.get('username')
    pwd = request.POST.get('pwd')
    if username == 'alex' and pwd == '123':
    url = request.GET.get('return_url')
    if url:
    ret = redirect(url)
    else:
    ret = redirect('/index/')
    # 设置 cookie
    # ret['Set-Cookie'] = 'is_login=100; Path=/'
    ret.set_cookie('is_login', '1') # 不加密的 Set-Cookie: is_login=1; Path=/
    ret.set_signed_cookie('is_login', '1', 's21',max_age=10000,) # 加密的
    return ret
    return render(request, 'login.html', {'error': '用户名或密码错误'}) # 登录验证装饰器
    def login_required(func):
    def inner(request, *args, **kwargs):
    # 获取 cookie
    is_login = request.COOKIES.get('is_login') # 不加密的
    is_login = request.get_signed_cookie('is_login', salt='s21', default='') # 加密的
    print(is_login)
    url = request.path_info
    if is_login != '1':
    return redirect('/login/?return_url={}'.format(url))
    # 已经登录
    ret = func(request, *args, **kwargs)
    return ret
    return inner # 在需要在需要登录才能访问到页面的视图上加装饰器
    @login_required
    def index(request):
    return HttpResponse('首页') @login_required
    def home(request):
    return HttpResponse('home') def logout(request):
    ret = redirect('/login/')
    ret.delete_cookie('is_login')
    return ret

二、 session

  1. 定义:保存在服务器上的一组组键值对(必须依赖cookie来使用)

  2. 使用session的原因:

    • cookie保存在浏览器本地,不安全
    • cookie保存的大小个数受到限制(cookie本身最大支持4096字节)
  3. 总结:cookie弥补了HTTP无状态的不足,但是cookie以文本的形式保存在浏览器本地,自身安全性较差,所以我们通过cookie识别不同用户,对应的在session里保存私密信息以及超过4096字节的文本

  4. 在django中操作session

    • 设置session:
    request.session['key'] = value
    request.session.setdefault('key',value) # 设置默认值,存在则不设置
    • 获取session:
    request.session['key']
    request.session.get('key',None)
    • 删除session:
    del request.session['key']
    • 其他操作:
    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items() # 会话session的key
    request.session.session_key # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired() # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key") # 删除当前会话的所有Session数据
    request.session.delete()
      
    # 删除当前的会话数据并删除会话的Cookie
    request.session.flush()
    # 这用于确保前面的会话数据不可以再次被用户的浏览器访问
    # 例如,django.contrib.auth.logout() 函数中就会调用它 # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
    # 如果value是个整数,session会在些秒数后失效
    # 如果value是个datatime或timedelta,session就会在这个时间后失效
    # 如果value是0,用户关闭浏览器session就会失效
    # 如果value是None,session会依赖全局session失效策略
  5. session版登陆验证

    from django.shortcuts import render, redirect, HttpResponse
    from django.views import View class Login(View):
    def get(self, request, *args, **kwargs):
    return render(request, 'login.html') def post(self, request, *args, **kwargs):
    username = request.POST.get('username')
    pwd = request.POST.get('pwd')
    if username == 'alex' and pwd == '123':
    url = request.GET.get('return_url')
    if url:
    ret = redirect(url)
    else:
    ret = redirect('/index/')
    # 设置 session
    request.session['is_login'] = 1 # value可以设置为数字
    # 设置会话Session和Cookie的超时时间,0表示用户关闭浏览器session就会失效
    # request.session.set_expiry(0)
    return ret
    return render(request, 'login.html', {'error': '用户名或密码错误'}) # 登录验证装饰器
    def login_required(func):
    def inner(request, *args, **kwargs):
    # 获取 session
    is_login = request.session.get('is_login')
    print(is_login)
    url = request.path_info
    if is_login != 1:
    return redirect('/login/?return_url={}'.format(url))
    # 已经登录
    ret = func(request, *args, **kwargs)
    return ret
    return inner # 在需要在需要登录才能访问到页面的视图上加装饰器
    @login_required
    def index(request):
    # request.session.session_key:会话session的key
    request.session.clear_expired() # 将失效的数据删除
    return HttpResponse('首页') @login_required
    def home(request):
    return HttpResponse('home') def logout(request):
    ret = redirect('/login/')
    request.session.delete() # 删除session数据 不删除cookie
    request.session.flush() # 删除session数据 并删除cookie
    return ret
  6. django中的session配置

    • 全局配置:from django.conf import global_settings
    1. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 2. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
    # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    SESSION_CACHE_ALIAS = 'default' 3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
    SESSION_FILE_PATH = None 4. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用设置项:
    # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_NAME = "sessionid"
    # Session的cookie保存的路径(默认)
    SESSION_COOKIE_PATH = "/"
    # Session的cookie保存的域名(默认)
    SESSION_COOKIE_DOMAIN = None
    # 是否Https传输cookie(默认)
    SESSION_COOKIE_SECURE = False
    # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_HTTPONLY = True
    # Session的cookie失效日期(2周)(默认)
    SESSION_COOKIE_AGE = 1209600
    # 是否关闭浏览器使得Session过期(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False
    # 是否每次请求都保存Session,默认修改之后才保存(默认)
    SESSION_SAVE_EVERY_REQUEST = False

浅谈cookie 和 session的更多相关文章

  1. 浅谈cookie 和session 的区别

    具体来说 cookie 是保存在“客户端”的,而session是保存在“服务端”的 cookie 是通过扩展http协议实现的 cookie 主要包括 :名字,值,过期时间,路径和域: 如果cooki ...

  2. (进阶篇)浅谈COOKIE和SESSION关系和区别

    COOKIE介绍 cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PHP,您能够创建并取回 coo ...

  3. 浅谈cookie和session

    Cookie简介 Cookie(复数形态Cookies),中文名称为“小型文本文件”,指某些网站为了辨别用户身份或存储用户相关信息而存储在用户本地终端(Client Side) 上的数据(通常为加密数 ...

  4. 浅谈cookie与session的区别

    cookie用的是在客户端保持状态的方案(它是在用户端的会话状态的存贮机制),前端也可以来设置他 所有浏览器都识别,并且会缓存在浏览器中. cookie是以key=value这种键值对的形式保存,每个 ...

  5. 浅谈cookie、session

    揭秘Cookie: cookie说的直白点就是保存在用户浏览器端的一个键值对,举个例子,你现在登录了京东商城,你把浏览器关闭之后,你再打开京东,你还是可以对你的账户继续操作,已经购买的商品,订单都是可 ...

  6. 浅谈Cookie、Session与Cache的区别

    以前实现数据的缓存有多种方法,如客户端的Cookie,服务器端的Session.Application. 一.Cookie Cookie是保存客户端的一组数据,主要用来保存用户的个人信息,主要存放浏览 ...

  7. 浅谈 cookie 和 session

    1.关闭浏览器后,session是否还存在? session在服务器和客户端各保留一个副本,关闭浏览器与否和session是否存在没有任何关系. session采取的是服务器端保持状态的方案,它存储在 ...

  8. 浅谈Cookie与Session技术

      一.什么是状态管理 将客户端与服务器之间多次交互当做一个整体来看,并且将多次交互所涉及的数据(状态)保存下来. 会话:当用户打开浏览器,访问多个WEB资源,然后关闭浏览器的过程,称之为一个会话,选 ...

  9. 浅谈cookie测试

    Cookie 提供了一种在Web 应用程序中存储用户特定信息的方法,例如存储用户的上次 访问时间等信息.假如不进行cookie存储一个网站的用户行为,那么可能会造成以下问题:用户进行购买几件商品转到结 ...

随机推荐

  1. Material 风格的搜索框MaterialSearchView的使用

    大多数App中都有搜索的功能,虽然国内实实在在的遵循Google material design设计语言来设计的App实在不多,但个人感觉MD真的是非常值得研究,这次给大家介绍的是 Material ...

  2. ucoreOS_lab8 实验报告

    所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...

  3. [b0033] python 归纳 (十八)_队列Queue在多线程中使用(二)

    # -*- coding: UTF-8 -*- """ 多线程同时读队列 使用 join(), task_done() 逻辑: 3个子线程并发 从有6个数据的队列中取数据 ...

  4. Mysql Join-连接查询(中)

    Mysql Join-连接查询(中) 认识 就我平时的数据接触来看, 连接查询也没有很复杂,不够是非常需要耐心和逻辑的, 一点点将数据查出来, 拼接等. 没有什么技巧, 多练习就会了. 无非就是表之间 ...

  5. BayaiM__SQLLDR_linux_shell高级版

    BayaiM__SQLLDR_linux_shell高级版   备注:1.因公司在职,商业机密,顾IP地方加了"*"号,你可以任意写一个数字做IP做就好.2.不要瞎BB,哥自己写的 ...

  6. Linux--简单实现nfs的目录挂载,ntp时间同步

    一.NFS (Network FileSystem) 网络文件系统 是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源. 在NFS的应用中,本地NFS的客户端 ...

  7. Mysql—索引原理与详解

    索引的原理 索引的优点和缺点和使用原则 索引优点: 可以加快数据的检索速度,提高查询速度. 所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段建立索引. 全文检索字段进行搜索优化. ...

  8. vue better-scroll

    better-scroll在vue项目中的使用 2017年12月21日 18:01:09 阅读数:411 1.准备工作 在项目中安装better-scroll: npm install --save ...

  9. 9.Go-反射、日志和线程休眠

    9.1反射 在Go语言标准库中reflect包提供了运行时反射,程序运行过程中动态操作结构体 当变量存储结构体属性名称,想要对结构体这个属性赋值或查看时,就可以使用反射 反射还可以用作判断变量类型 整 ...

  10. MySQL实战45讲学习笔记:第四十三讲

    一.本节概述 我经常被问到这样一个问题:分区表有什么问题,为什么公司规范不让使用分区表呢?今天,我们就来聊聊分区表的使用行为,然后再一起回答这个问题. 二.分区表是什么? 为了说明分区表的组织形式,我 ...