|
# cookie和session
发展史
1.网站都没有保存用户功能的需求 所有用户访问返回的结果都一样
eg:新闻、博客、文章
2、出现了一些需要博爱村用信息的网站
eg:淘宝、京东、支付宝、
[]
以登录功能为例:如果不保存用户登陆状态,也就意味着用户每次访问网站都需要重复输入用户名和密码(你觉得还想要继续使用吗)
当用户第一次登录成功之后 将用户的用户名和面膜返回给用户浏览器 让用户浏览器保存本地,之后访问网站的时候浏览器自动将保存的
用户名和密码发送服务端,服务端获取之后做验证
早期这种方式非常大的安全隐患
[]
优化:
当用户登陆成功之后,服务端会随机产生一个字符串(在服务端保存用户数,用k,v键值对的形式),交给客户端保存
随机字符串1:用户1相关信息
随机字符串2:用户2相关信息
随机字符串3:用户3相关信息
之后访问服务端的时候,都带着该随机字符串,服务端去数据库比对时候有对应的随机字符串从而获取到用户的信息
但如果你拿到了或者截获到了该随机字符串,那么你就可以充当当前用户 其实还是有安全隐患的
你要知道在web领域没有绝对的安全和不安全
[cookie:
服务端保存在客户端的浏览器上的信息都成之为cookie
他的表现形式一般都是k:v键值对(可以有多个-
[session:
数据是保存在服务端的,一般也是kv键值对
下述内容暂了解即可,先给我搞明白session和cookie使用在说话!]
[token:
session虽然数据是保存在服务端的 但是禁不住量大
服务端不在保存数据
登陆成功之后 讲一段信息进行加密处理(加密算法之后你公司开发知道)
将加密之后的结果拼接在信息后面 整体信息返回给浏览器保存
浏览器下次访问的时候带着该信息 服务端自动切取前面一段信息再次使用自己的加密算法,
去和浏览器尾部的密文进行比对]
jwt认证
三段信息
后期会讲
总结:
1.cookie保存在客户端浏览器的信息
2.session保存在服务端上的信息
3.session是基于cookie工作的(大部分的保存用户状态的操作都需要使用cookie)
# cookie
虽然cookie是服务端告诉客户端浏览器需要保存的内容
但是客户端浏览器可以选择拒绝保存 如果禁止了 那么 只要是需要记录用户状态网站登录功能都无法正常使用
[视图函数的返回值]
return HttpResponse()
return render()
return redirect()obj1 = HttpResponse()
# 操作cookie
return obj1
obj2= render()
# 操作cookie
return obj2
obj3 = redirect()
# 操作cookie
return obj3
如果你想要操作cookie,你就不得不利用obj对象
[设置cookie]
obj.set_cookie(key,value)
[获取cookie]
request.COOKIES.get(key)
在设置cookie到时候可以添加一个超时时间
obj.set_cookie('username','jason666',max_age=3,expires=3)
[cookie前戏
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
obj=redirect('/home/')
obj.set_cookie('username', 'jason666')
return obj
return render(request,'login.html')
def home(request):
if request.COOKIES.get('username') == 'jason666':
return HttpResponse('我是登录后才能看的界面')
return redirect('/login/')def login_auth(func):
def inner(request,*args,**kwargs):
# print(request.path_info)
# print(request.get_full_path()) # 能够获取到用户上一次想要访问的url
target_url = request.get_full_path()
if request.COOKIES.get('username'):
return func(request,*args,**kwargs)
else:
return redirect('/login/?next=%s'%target_url)
return inner
[推导出的完成一个真正的登录功能
def login_auth(func):
def inner(request,*args,**kwargs):
# print(request.path_info)
# print(request.get_full_path()) # 能够获取到用户上一次想要访问的url
target_url = request.get_full_path()
if request.COOKIES.get('username'):
return func(request,*args,**kwargs)
else:
return redirect('/login/?next=%s'%target_url)
return inner
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
# 获取用户上一次想要访问的url
target_url = request.GET.get('next') # 这个结果可能是None
if target_url:
obj = redirect(target_url)
else:
# 保存用户登陆状态
obj = redirect('/home/')
# 让浏览器记录cookie数据
obj.set_cookie('username', 'jason666')
# 超时时间3秒到期
"""
浏览器不单单会帮你存
而且后面每次访问你的时候还会带着它过来
"""
# 跳转到一个需要用户登陆之后才能看的页面
return obj
return render(request,'login.html')
@login_auth
def home(request):
# 获取cookie信息 判断你有没有
# if request.COOKIES.get('username') == 'jason666':
# return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")
# # 没有登陆应该跳转到登陆页面
# return redirect('/login/')
return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")
|
|
|