cookie和session 以及Django中应用
cookie和session机制
cookie和session机制
cookie机制采用的是在客户端保持状态的方案。作用就是为了解决HTTP协议无状态的缺陷所做的努力。
session机制采用的是一种在客户端与服务器之间保持状态的解决方案。由于采用服务器端保持状态的方案在客户端也需要保持一个标识,
所以session机制可能需要借助于cookie机制来达到保存标识的目的。session还提供了方便管理全局变量的方式。
session 是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分哪个用户的session
cookie和session内容
cookie内容主要包括:key, value, 过期时间,路径和域。路径和域一起构成了cookie的作用范围。
cookie的使用是由浏览器按照一定的规则在后台自动发送给服务器的,浏览器检查所有储存的cookie,
如果某个cookie的作用范围大于等于将要请求的资源所在位置,将cookie附在请求资源的HTTP请求头上发给服务器。
cookie的生命周期跟过期时间相关,如果不设置过期时间,成为回话cookie,保存在内存中,关闭浏览器窗口,cookie消失。
如果设置过期时间,浏览器会把cookie写入硬盘,这些cookie仍然有效,直到超过设定的过期时间。
存在硬盘上的cookie可以在同一个浏览器不同进程间共享,比如两个Chrome窗口。存在内存的,不同浏览器不同的处理方式。
session内容,服务器使用类似python字典的 key value的形式存储的,存储session方式很多,数据库,缓存,文件,加密cookie,数据库加缓存。
Django中的cookie
cookie中的一些参数:
-- max_age=1, cookie生效的时间,单位是秒。
-- expires 具体的过期时间
-- path= “/” 作用路径 写/代表所有的url都可以访问到cookie 可以指定url
-- domain= None None代表当前域名 指定哪个域名以及它下面的二级域名(子域名)可以访问这个cookie
-- secure = False Https安全相关
-- httponly=False 限制只能通过http传输 JS无法再传输中获取和修改
设置cookie以及获取cookie
# 设置cookie # 普通设置方式 response_obj.set_cookie("key", "value",expires="time",path="/") # 加盐 # 加盐需要在服务端进行解盐才能查看 response_obj.set_signed_cookie("k","v",salt="gaoxin")
# 获取cookie # 普通 cookies = request.COOKIES.get("key") # 加盐 cookies = request.get_signed_cookie("k", salt="gaoxin")
cookie + session 的工作原理
-- 1 当用户来访问服务器时,服务端生成一个随机字符串。
-- 2 当用户登录成功后,把 {sessionID:随机字符串} 加到cookie里发送给浏览器用户。
-- 3 服务器以发送给客户端cookie中的随机字符串为键,用户信息做值,保存用户信息
Django中的session
django中session中一些方法:
注意 :request.session['name'] = 'gaoxin' 默认隐含了通过sessionID找到用户信息那一步,删除也是如此。
# 获取,设置,删除session中数据 # 获取 request.session['key'] request.session.get('key', None) # 不报错 设置一个默认值 # 设置 request.session['key'] = "value" request.session.setdefault('key', "value")# 存在则不设置 # 删除 del request.session['key'] # 获取所有的键,值,键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 用户session的随机字符串 request.session.session_key # 清除数据库过期的session request.session.clear_expired() # 检查用户session的随机字符串是否在数据库中 request.session.exists("session_key") # 清除当前用户的所有session数据 request.session.delete("session_key") # 设置session的过期时间 request.session.set_expiry(value) # 如果value是个整数 session会在这些秒后失效 # 如果是个datetime类型的 就会在这个时间后失效 # 如果value是0,用户关闭浏览器session就会失效 # 如果value是None,session就会依赖全局session失效策略
session的配置文件
# 引擎 (存储位置) SESSION_ENGINE = "django.contrib.session.backends.file" SESSION_ENGINE = "django.contrib.session.backends.cached_db" # 缓存文件路径 SESSION_FILE_PATH = "文件路径" # cookie保存在浏览器上的key 即 sessionID = 随机字符串 SESSION_COOKIE_NAME = "gaoxin" # cookie 保存的路径 SESSION_COOKIE_PATH = '/' # cookie保存的域名 SESSION_COOKIE_DOMAIN = None # 是否https传输cookie SESSION_COOKIE_SECURE = False # 是否只支持http传输 SESSION_COOKIE_HTTPONLY = True # cookie失效日期为600000秒 默认1209600秒 SESSION_COOKIE_AGE = 600000 # 是否关闭浏览器使session过期 SESSION_EXPIRE_BROWSER_CLOSE = False # 如果设置成True 会在每次请求服务器的时候会以新的请求时间向后延期过期时间 # 淘宝一直逛就不会登出 不刷新页面过段时间就自动登出 SESSION_SAVE_EVERY_REQUEST = True