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

    1. cookie:

      1. #保存在用户浏览器端的键值对,向服务端发请求时会自动携带。
      2. 为什么要用cookie?
       # 我们现在做的登陆是有问题的,当我们使用登陆页面登陆的时候登陆成功会返回一个登陆成功的页面,而我们没有在不使用cookie的时候,我们可以是直接访问登陆成功的页面,不需要验证,为了解决这个问题我们应用的cookie
      3.写一个cookie:
      # 在登陆页面登陆成功后写一个返回,在这个返回页面中设置一个cookie
      	result = redirect('home')
          result.set_cookie('xxx','zfy')
      4. 判断页面是否有这个cookie
      	name=request.COOKIES.get('xxx')  # 获取这个页面中的cookie
      
      1. cookie应用场景:
        用户认证
        投票
        每页默认显示数据
    2. session:

      1. session应用场景
        用户认证
        短信验证过期
        权限管理
      依赖cookie
      #是一种存储数据的方式,依赖于cookie,实现本质:
      用户向服务端发送请求,服务端做两件事:生成随机字符串;为此用户开辟一个独立的空间来存放当前用户独有的值.
          在空间中如何想要设置值:
          request.session['x1'] = 123
          request.session['x2'] = 456
          在空间中取值:那个页面需要就在那个页面获取
          request.session['x2']
          request.session.get('x2')
      视图函数中的业务操作处理完毕,给用户响应,在响应时会
      将随机字符串存储到用户浏览器的cookie中.
      

      如果遇到页面多的时候每个都需要获取这样就会写很多的重复代码,所以可以写一个装饰器:

      def auth(func):
          def inner(request,*args,**kwargs):
              name = request.session.get('name')
              if name:
                  return render(request, 'home.html', {"name": name})
              return func(*args,**kwargs)
          return inner
      

      如果你在装饰器中没有获取值,没有进行模板渲染,在页面也可以获取:

      <div class="container">
          <div class="page-header">
        <h1>这是首页 <small>欢迎{{ request.session.name }}登陆</small></h1>
      </div>
      </div>
      
       request.session.name  ---  也可以获取到session中的值
      
    3. django和session相关的 配置

      SESSION_COOKIE_NAME = "sessionid" #Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
      SESSION_COOKIE_DOMAIN = None #api.baidu.com /www.baidu.com/ xxx.baidu.com  (那些域名可以访问)
      SESSION_COOKIE_PATH = "/" # Session的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,默认修改之后才保存
      
      1. SESSION_COOKIE_NAME = "sessionid"

    1. django中的session如何设置过期时间? (记)

      SESSION_COOKIE_AGE = 1209600 # Session的
      cookie失效日期(2周)
      
    2. django的session默认存储在数据库,可以放在其他地方吗?

      小系统:默认放在数据库即可.
      大系统:缓存(redis)
      
    3. 文件

      SESSION_ENGINE ='django.contrib.sessions.backends.file'
      SESSION_FILE_PATH = '/sssss/'
      
    4. 缓存(内存)

      SESSION_ENGINE ='django.contrib.sessions.backends.cache'
      SESSION_CACHE_ALIAS = 'default'
      CACHES = {'default': {'BACKEND':'django.core.cache.backends.locmem.LocMemCache','LOCATION': 'unique-snowflake',}}
      
    5. 缓存(redis)

      SESSION_ENGINE ='django.contrib.sessions.backends.cache'
      SESSION_CACHE_ALIAS = 'default'
      CACHES = {
          "default": {"BACKEND":"django_redis.cache.RedisCache",
      	"LOCATION":"redis://127.0.0.1:6379",
      	"OPTIONS": {"CLIENT_CLASS":"django_redis.client.DefaultClient",
      	"CONNECTION_POOL_KWARGS":{"max_connections": 100}
      # "PASSWORD": "密码",
      	}
      	}
      	}
      # 设置(添加&修
      
    6. 操作session

      # 设置(添加&修改)
      request.session['x1'] = 123
      request.session['x2'] = 456
      # 读取
      request.session['xx']
      request.session.get('xx')
      # 删除
      del request.session['xx']
      
      
      request.session.keys()    # 获取session的所有键
      request.session.values()   # 获取session的所有值
      # 结果
      '''
      dict_keys(['name', 'id'])
      dict_values(['adrian', 2])
      '''
      
      request.session.items()   # 获取session的所有键值对以元组形式
      #结果
      '''
      dict_items([('name', 'adrian'), ('id', 2)])
      '''
      
      request.session.set_expiry(value)  # 设置浏览器保存cookie的过期时间  value是一个数字(以秒计时)
      request.session.session_key    # 获取cookie随机生成的字符串
      #  rr0nsqjmh3wxwogu2gyx381z1vza1qwa
      
    7. 强调:

      session中的数据是根据用户相互隔离.

      就是说session在每个用户使用时单独的开辟了一块空间进行存放数据,互不干扰

    8. 通过js设置cookie

      document.cookie = 'k1=wy222;path=/'
      $.cookie('k1','wy222',{path:'/'})
      # 注意:path不同会导致设置不同.
      

      path的作用

      / -----  当前网站中所有的URL都能读取到此值.
      ""   -----   只能在当前页面访问的到此数据.
      /index/ ------  只能在/index/xxx 的网页中查看.
      
  • 相关阅读:
    Classloader中loadClass()方法和Class.forName()区别
    java.lang.Class解析
    JDK_Proxy_InvocationHandler_动态代理
    spring之Annotation
    annotation之@Autowired、@Inject、@Resource三者区别
    spring之生命周期
    spring之lazy-init
    我是如何在SQLServer中处理每天四亿三千万记录的
    (转)SQL一次性插入大量数据
    SQL SERVER连接池
  • 原文地址:https://www.cnblogs.com/zhufanyu/p/11639298.html
Copyright © 2011-2022 走看看