Cookie是保存在浏览器端的”键值对”,服务器端可以向用户浏览器写入Cookie,客户端每次发Http请求时,在请求头中携带当前所有可访问的cookie,常应用于登录等环节。

  • set_cookie(明文)

    cookie默认的生命周期在浏览器关闭后就结束了。其可以访问到的域名在创建的域名及其子域下,可以访问到的路径在创建的路径下及其子路径下,可以通过设置属性改变
    Set-Cookie响应头是服务器返回的响应头用来在浏览器种cookie,一旦被种下,当浏览器访问符合条件的url地址时,会自动带上这个cookie

    参数:Expires=<date> -> cookie最长有效时间Secure -> 一个带有安全属性的 cookie 只有在请求使用SSL和HTTPS协议的时候才会被发送到服务器。; …

1
2
3
4
5
6
#   login,输入表单正确 
obj = redirect('/classes/') # 根本上还是=HttpResponse对象
obj.set_signed_cookie('ticket','you are allowed')
return obj
else
return render(request, 'login.html', {'msg':"ERROR"})

​ 对应获取方式:

1
2
if not request.COOKIES.get('ticket'):
return redirect('/login/')
  • cookie签名(加salt)
1
obj.set_signed_cookie('ticket','you are allowed',salt="salt")

​ 获取时要破解:

1
tk = request.get_signed_cookie('ticket',salt='salt')
  • 自定义签名

对于登录操作,要想将登录逻辑用到每个url,则需要用到装饰器。

Session

保存在服务端的数据(本质上是键值对)

当客户端发送请求时,服务器端生成随机字符串,每个字符串对应着相应的数据信息(用户名,id,密码等)。当发响应给客户端时,Cookie是相应的随机字符串而不是数据信息。当客户端再次发来含有Cookie的请求时,服务器端将随机字符串进行匹配,获取到该Cookie所代表的信息。

优点:防止直接泄露敏感信息给客户端。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def login(request):
if request.method == "GET":
pass
else:
user = request.POST.get('user')
pwd = request.POST.get('pwd')
obj = models.UserAdmin.objects.filter(username=user,password=pwd).first()
if obj:
# 1. 生成随机字符串
# 2. 通过Cookie发送给客户端
# 3. 服务器端保存:{随机字符串1:{'username':'dhy', 'email':'dhy@qq.com'}}
request.session['username']='dhy'
request.session['email']='dhy@qq.com'
return redirect('/index/')
else:
return render(...)

def index(request):
# 1. 获取客户端cookie中的随机字符串
# 2. 在session中(实际上是一张数据库表)查找有无对应的随机字符串
# 3. 在session对应key的value中查找是否有username
user = request.session.get('username')
if user:
return HttpResponse('%s登录成功' %user)
else:
return redirect('/login/')