一、cookie产生原因
二、cookie的原理图
三、Django中如何设置/读取/删除cookie
四、Django中如何设置cookie的参数
一、cookie产生原因
HTTP协议的无状态保存:
指的是同一个浏览器给服务器发两次请求,
服务器不知道第二次请求之前是否还发过请求。
每一次访问服务器都认为是新请求。
所以需要对会话进行跟踪,cookie就是会话跟踪技术之一
PS:四种会话跟踪技术
a) URL重写:
URL地址重写的原理是将该用户Session的id信息重写 到URL地址中,以便在服务器端进行识别不同的用户。
URL重写能够在客户端停用cookies或者不支持cookies的时候仍然能够发挥作用。
b) 隐藏表单域:
将用户Session的id添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示,浏览时看不到,源代码中有。
c) Cookie
d) session
二、cookie的原理图
cookie是具体一个浏览器针对一个服务器存储的key-value
有过期时间,可调,默认是两周
问题来了,服务器是指什么?ip+port 还是域名?
看cookie的原理图:
先看上门图片中的场景,理解好三个问题,就理解了cookie机制:
1、在cookie有效期内,哪怕图中A电脑关机在开机,A电脑的浏览器访问域名y1还是会带这个cookie{is_login:true}
2、在cookie有效期内,A电脑的同一个浏览器访问域名y2不会带上域名y1的cookie,而是y2的cookie
2、如果是新的浏览器,访问这个服务器,会带一个空cookie
三、Django中如何设置/读取/删除cookie
1、设置cookie
def login(request):
login_success=1
if login_success:
# 获取响应体(render或redirect也可以,都是继承的HttpResponse)
response=HttpResponse("登录成功")
# 在响应体设置cookie
response.set_cookie("is_login", True)
return response
else:
return HttpResponse("登录失败")
2、读取cookie
def index(request):
cookies = request.COOKIES
# cookies.get("k","")获取不到默认为""
is_login = cookies.get("is_login")
if is_login:
#已登录
else:
#跳转到登录页面
3、删除cookie:注销的时候能用到
response.delete_cookie("session_id",path="/",domain=name)
四、Django中如何设置cookie的参数
def set_cookie(self,
key, #键
value='', #值
max_age=None, #超时时间 cookie需要延续的时间(以秒为单位)如果参数是None,这个cookie会延续到浏览器关闭为止。
expires=None, #超时时间 expires默认None ,cookie失效的实际日期/时间。设置方式datetime.datetime(year=2018,month=5,day=29,hour=14)
path='/', #Cookie生效的路径,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他的应用。
# “/”表示根路径,根路径的cookie可以被任何url的视图函数获取
domain=None, #Cookie生效的域名,你可用这个参数来构造一个跨站cookie。
#如, domain=".example.com" 表示所构造的cookie对下面这些站点都是可读的:
#www.example.com 、 www2.example.com 和an.other.sub.domain.example.com
#如果该参数设置为 None ,cookie只能由设置它的站点读取。
secure=False, #如果设置为 True ,浏览器将通过HTTPS来回传cookie。
httponly=False #只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
)