介绍一些背景信息
"""
1. 网站它是不用保存用户的信息,最早期的时候,网站都是一些静态网站
eg:新闻网站 博客
2. 随着技术发展,诞生了很多需要登录的网站
eg: 淘宝 京东 支付宝...
登录:解决了在网站中,网站可以识别出你是谁
以登录为例,当用户第一次登录网站的时候,用户输入用户名和密码,如果不保存下来,拿用户就每次都需要登录,意味着每次都要输入用户名和密码、
针对以上的问题,如何解决的嫩?
利用到了cookie,当用户第一次登录成功网站的时候,服务端告诉浏览器把用户名和密码都给用户的浏览器,然后,用户浏览器把用户名和密码保存在本地,之后,用户在每次访问网站的时候,会自动把之前保存的用户名和密码都传给服务端,服务端接收浏览器传过来的用户名和密码在进行验证.
针对以上方案有没有问题? 肯定是有的,把用户名和密码保存在浏览器本地最大的问题就是不安全!!!
如何优化一下上述不安全问题?
session的诞生, session是把数据保存在服务端的,但是,session会生成一个随机字符串,在服务端做随机字符串和用户信息的对应关系
就是把用户信息保存在数据表中了,它是如何保存的?
随机字符串1:用户信息1
随机字符串2:用户信息2
随机字符串3:用户信息3
session做的事情:
1. 生成一个随机字符串
2. 把随机字符串和用户信息的对应关系保存在数据表中
3. 把随机字符串返回给浏览器,让浏览器把随机字符串保存下来
之后,用户在访问网站的时候,会把随机字符串一块提交过来,服务端拿着随机字符串去数据表中查询,如果查到了,说明登录了,如果查不到,就说明还没有登录
select * from t where key = ''
背景信息:cookie在浏览器上是可以选择不保存的
面试题1:session是基于cookie工作的?对,为什么?
面试题2:如果浏览器把保存cookie的开关关掉了,说白了就是不能保存用户信息了,问:session一定不能用了?对于不对?不对,
session把数据保存在数据表里了,但是,当数据量特备大的时候,查询效率肯定会降低
token:就是一个算法
"""1. cookie
# 就是把数据保存在浏览器上的数据都可以称之为cookie
cookie一般保存的形式是:k:v键值对
2. session
# session把数据保存在服务端关于cookie和session的面试题:
1. cookie把数据保存在浏览器
2. session把数据保存在服务端
3. session保存的数据更加安全
3. token
4. jwt------------>三段式信息-------------》加密得到的
Cookie的操作
# 使用Django操作cookie
return HttpResponse
return redirect
return render
obj = HttpResponse
return objobj = redirect
return objobj = render
return obj# 如果你想操作cookie,必须使用obj对象
1. 设置cookie
obj.set_cookie('key', 'value')
2. 获取cookie
print(request.COOKIES.get("key"))3. 还可以给cookie设置一个过期时间
max_age:
expires:是IE浏览器
# 都是用来设置过期时间的
4. path
5. 前端也可以获取cookie和session
localstorage
sessionstorage
6. 删除Cookie(退出功能,注销功能)
res.delete_cookie
# 写一个登录的案例
操作
# 都是用来保存用户信息的
为什么要用它来保存用户信息的?因为HTTP协议的无状态,意思是不能保存用户信息的
但是呢,我们网站又需要保存用户信息,所以,诞生了一些保存用户新的技术,cookie,session,token ,jwt# cookie
1. cookie是保存在浏览器上了,但是用户可以自行关闭cookie 的保存
2. 如何进行保存cookie
# 保存cookie 必须使用HttpResponse对象
obj = HttpResponse()
obj.set_cookie('key1', 'value1') # 有什么变化?在浏览器上面就会有一个键值对
obj.set_cookie('key2', 'value2') # 有什么变化?在浏览器上面就会有一个键值对
obj.set_cookie('key3', 'value3') # 有什么变化?在浏览器上面就会有一个键值对
return obj
# 服务端让客户端浏览器保存的,用户有权可以关闭cookie,提醒大家不要关闭cookie
3. 取值
request.COOKIES.get('key1') # value
request.COOKIES.get('key2') # value
request.COOKIES.get('key3') # value
4. cookie的一些其他参数
obj.set_cookie('key', 'value')
max_age:设置过期时间
path:生效的路径
domain:生效的域名
secure:False,通过https协议传递cookie
httponly:false,就不能通过js抓取到cookie
5. 删除cookie(注销功能)
obj.delete_cookie('key1')
obj.delete_cookie('key2')
obj.delete_cookie('key3')
Django操作session
# cookie是保存在浏览器上面,它的数据不安全
# 怎么做个优化?把用户的信息保存在服务端,session做的
# session它还是基于cookie工作的,它的原理是:
1. 先做用户信息的认证
2. 生成一个随机字符串
3. 用这个随机字符和用户信息做个映射,保存起来,django默认是保存在MySQL中
key data
随机字符串 用户信息
4. 服务端会把随机字符串返回给浏览器,浏览器把随机字符串保存起来,下次访问的时候,一块带着随机字符串传给服务端,服务端拿着这个随机字符串去数据表中查询,如果查到了,说明已经登录过了,
'''要求每个同学必须能口述出来'''
# 如果你在Django中默认使用session,前提是必须有django_session表
在cookie中,session保存的key默认是:sessionid
# sesssion的默认过期时间是:14天
def set_session(request):
request.session['username'] = 'kevin'
# 这个数据保存在了哪里?
"""
设置session发生的事情:
1. 生成了一个随机字符串
2. 把数据给你保存到了django_session表中
2.1 这个操作是在中间件中操作的
2.2 请求来的时候,是把数据准备好,在缓存中(内存)
2.3 响应走的时候,才真正的执行了create,insert方法
3. 把随机字符串返回给浏览器
"""
return HttpResponse('set_Session')
def get_session(request):
print(request.session.get('username'))
print(request.session['username'])
"""
获取session发生的事情:
1. 获取cookie值,名为sessionid的cookie值
2. 拿着这个cookie值去数据库中查询
3. 如果查询到了,把查询到的数据封装到request.session中
"""
return HttpResponse('get_Session')
# 删除session
def del_Session(request):
# 删除session
request.session.delete() # (只删数据库)
request.session.flush() # 数据库和cookie都删
return HttpResponse('del_session')
# cookie和session的又一个区别:
1. cookie设置数据是有大小限制的
2. session没有数据限制大小的