Django-会话跟踪cookie和session
Django-会话跟踪cookie和session
HTTP协议 是短连接、且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态。
Cookie是来自服务端,保存在浏览器的键值对,主要应用于用户登录;
1.cookie
1.1Cookie的产生
HTTP协议是无状态的。
无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况,因此对于服务器来说每一次请求都是全新的,在会话中产生的数据并不会保存,为了保存数据Cookie应运而生。
1.2Cookie的原理
由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie。
1.3Cookie的格式
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
-
key:这个cookie的key。
-
value:这个cookie的value。
-
max_age=1 :cookie生效的时间,单位是秒
-
expires:具体过期日期
-
path=’/’:指定那个url可以访问到cookie;‘/’是所有; path=’/’
-
domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie
-
secure=False:https安全相关
-
httponly=False:限制只能通过http传输,JS无法在传输中获取和修改
1.4Cookie的操作
1.4.1创建
response创建
- 不加盐
def cookie_set(request):
response = HttpResponse('')
response.set_cookie(key='xqb', value={'yy': '123123'}, max_age=20)
print('-----------------------------------------------')
return response
- 加盐
def cookie_set(request):
response = HttpResponse('')
response.set_cookie(key='xqb', value={'yy': '123123'}, max_age=20,salt='123')
print('-----------------------------------------------')
return response
1.4.2获取
request获取
- 不加盐
def get_cookie(request):
get_cookie_from_cookie = request.COOKIES.get('xqb')
print(type(request.COOKIES.get('xqb')))
return HttpResponse(get_cookie_from_cookie)
- 加盐
def get_cookie(request):
get_cookie_from_cookie = request.COOKIES.get('xqb',salt='123')
print(type(request.COOKIES.get('xqb')))
return HttpResponse(get_cookie_from_cookie)
1.4.2删除
使用delete_cookie来删除,实际上删除cookie
就是将指定的cookie
的值设置为空的字符串,然后使用将他的过期时间设置为0
,也就是浏览器关闭后就过期。
def delete_cookie(request):
response = HttpResponse("ok")
response.delete_cookie("user_id")
return response
2.session
2.1session的产生
cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患,
于是cookie+session出现了!我们可以 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串),
基于以上原因:cook+session组合就此作古了单单使用cookie做会话保持的方式
Session依赖Cookie!但与Cookie不同的地方在于Session将所有的数据都放在服务器端,用户浏览器的Cookie中只会保存一个非明文的识别信息,比如哈希值。
Session是大多数网站都需要具备的功能。Django为我们提供了一个通用的Session框架,并且可以使用多种session数据的保存方式:
- 保存在数据库内
- 保存到缓存
- 保存到文件内
- 保存到cookie内
通常情况,没有特别需求的话,请使用保存在数据库内的方式,尽量不要保存到Cookie内。
Django的session框架支持匿名会话,封装了cookies的发送和接收过程。cookie包含一个会话ID而不是数据本身(除非你使用的是基于后端的cookie)。
Django的会话框架完全地、唯一地基于Cookie。它不像PHP一样,把会话的ID放在URL中。那样不仅使得URL变得丑陋,还使得你的网站易于受到通过"Referer"头部进行窃取会话ID的攻击。
2.2.1session的创建
使用request
def set_session(request):
request.session['user'] = 'rob'
return HttpResponse('session 设置')
2.2.2session的获取
同样使用request
def get_session(request):
get_session_data = request.session.get('user')
return HttpResponse(get_session_data)
2.2.3删除
request.session.flush()
2.2.4删除session中的指定键及值
del request.session[‘key’]
2.2.5设置会话的超时时间 单位s
request.session.set_expiry(value):
- 如果value是个datatime或timedelta,session就会在这个时间后失效。
- 如果value是0,用户关闭浏览器session就会失效。
- 如果value是None,session会依赖全局session失效策略
3.cookie和session的联系和区别
1.cookie和session都是会话技术,cookie是运行在客户端,session是运行在服务器端。
2.cookie由大小限制以及浏览器在存cookie的个数也是有限的,session是没有大小限制和服务器的内存大小有关。
3.cookie由安全隐患,通过拦截或本地找到cookie后可以进行攻击。
4.session是保存子服务器端上,存在一段时间才会消失,如果session过多会增加服务器的压力。
上一篇: jsDOM分享1
下一篇: NOIp 2018 旅行 题解