会话跟踪技术--Cookie
2.cookie知识介绍
Cookie是key-value结构,类似于一个python中的字典。随着服务器端的响应发送给客户端浏览器。
然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。
Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,
并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有
这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!
注意:
- cookie:饼干:具体一个浏览器针对一个服务器存储的key value{}结构
- 针对不同服务器,相应的浏览器储存不同的key value,而且一般有时间限制.
- 一个浏览器访问了服务器如果得到了Cookie,接下来不管访问该服务器的任何路径都会带上这个Cookie
- 一个浏览器对于同一个服务器可以同时储蓄多个Cookie,可以给跟新
- csrftoken是Django中间件自带的(后面会讲)
Cookie规范
- Cookie大小上限为4KB;
- 一个服务器最多在客户端浏览器上保存20个Cookie;
- 一个浏览器最多保存300个Cookie;
注意:
- 浏览器可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500个Cookie等!
- 不同浏览器之间是不共享Cookie的。
**Cookie与HTTP头 **
Cookie是通过HTTP请求和响应头在客户端和服务器端传递的:
- Cookie:请求头,客户端发送给服务器端;
- 格式:Cookie: a=A; b=B; c=C。即多个Cookie用分号离开; Set-Cookie:响应头,服务器端发送给客户端;
- 一个Cookie对象一个Set-Cookie: Set-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C
Cookie的覆盖
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。
django中的cookie语法
设置cookie:
response = HttpResponse(...) 或
response = render(request, ...) 或
response = redirect()
response.set_cookie(key,value,...)
response.set_signed_cookie(key,value,salt='加密盐',...)
设置cookie源码对应的参数
class HttpResponseBase:
def set_cookie(self, key, 键
value='', 值
max_age=None, 超长时间 IE浏览器不支持
cookie需要延续的时间(以秒为单位)
如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止。
expires=None, 超长时间
expires默认None ,cookie失效的实际日期/时间。
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获取
不是绝对,底层抓包可以获取到也可以被覆盖)
): pass 实现逻辑略
获取cookie:
request.COOKIES
value = request.COOKIES.get("key")
删除cookie:
response.delete_cookie("cookie_key",path="/",domain=name)
3. Django示例学习
项目配置/setting.py
TIME_ZONE = 'Asia/Shanghai'
app01/models.py
from django.db import models
class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
email = models.EmailField()
tel = models.CharField(max_length=32)
项目配置/urls.py
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('login/', views.login),
path('index/', views.index),
path('noindex/', views.noindex),
]
app01/views.py
def login(request):
if request.method == "POST":
name = request.POST.get("name")
pwd = request.POST.get("pwd")
user = UserInfo.objects.filter(name=name,pwd=pwd)
if user: # 登陆成功
"""在服务器端设置Cookie的相关参数(客户端用js,或者浏览器自带工具)!
HttpResponse() render() redirect()
都可以设置Cookie 调用set_cookie方法:
"""
# 以 HttpResponse为例子进行设置cookie
response = HttpResponse("登录成功")
response.set_cookie("username", name) # 创建登录名(cookie的简直随便创建)
# 删除cookie
# response.delete_cookie("username", path="/",domain=name)
# 设置超长时间 相对时间 超过了事件,对应的key value就不存在了!
# response.set_cookie("is_login",True,max_age=10)
# 设置超长时间 绝对时间 格林威治时间(当前时间减去8小时)
# import datetime
# data = datetime.datetime(year=2018,month=8,day=10,hour=13,minute=5)
# response.set_cookie("is_login", True, expires=data)
# 有效路径 设置指定路径
response.set_cookie("is_login", True, path="/index/")
# 记录当前登录时间
# 将settings 里面 TIME_ZONE的值 改成 'Asia/Shanghai'
import datetime
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
response.set_cookie("login_time", now)
return response
else:
return HttpResponse("登录失败")
else:
return render(request,"login.html",locals())
def index(request):
"""
request.COOKIES 取出请求中的Cookies
"""
print(request.COOKIES)
is_login = request.COOKIES.get("is_login")
username = request.COOKIES.get("username")
print("username:", username) # username: lingting
print("is_login:", is_login) # is_login: True
if is_login:
"""Cookie保存上次登录时间
并自己写一个是否访问过当前页面的逻辑 last_visit_time
"""
import datetime
last_login_time = request.COOKIES.get("login_time")
last_visit_time = request.COOKIES.get("last_visit_time") # 第一次访问为空
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
myrender = render(request, "index.html", locals())
myrender.set_cookie("last_visit_time", now)
return myrender
else:
return redirect("/login/")
def noindex(request):
""" 色是"""
username = request.COOKIES.get("username")
is_login = request.COOKIES.get("is_login")
print("username", username) # username: lingting
print("is_login", is_login) # is_login None
return HttpResponse("OK")
templatetags/login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row" style="padding: 0 18%;margin-top:50px;">
<form action="" method="post">
{% csrf_token %}
<div class="form-group">
<label for="user">用户名</label>
<input type="text" class="form-control" id="user" placeholder="用户名" name="name">
</div>
<div class="form-group">
<label for="Password">密码</label>
<input type="password" class="form-control" id="Password" placeholder="密码" name="pwd">
</div>
<button type="submit" class="btn btn-default">提交</button>
</form>
</div>
</div>
</body>
</html>
templatetags/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row text-center">
<h1>hi,{{ username }}</h1>
<h2>上次登录时间:{{ last_login_time }}</h2>
<h2>上次访问时间:{{ last_visit_time }}</h2>
<h2>本次跟新时间:{{ now }}</h2>
</div>
</div>
</body>
</html>
4. jquery 操作cookie
准备
定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术;
下载与引入:jquery.cookie.js基于jquery;先引入jquery,再引入:jquery.cookie.js;下载:http://plugins.jquery.com/cookie/
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.cookie.js"></script>
1.添加一个"会话cookie"
$.cookie('the_cookie', 'the_value');
这里没有指明 cookie有效时间,所创建的cookie有效期默认到用户关闭浏览器为止,所以被称为 “会话cookie(session cookie)”。
2.创建一个cookie并设置有效时间为7天
$.cookie('the_cookie', 'the_value', { expires: 7 });
这里指明了cookie有效时间,所创建的cookie被称为“持久 cookie (persistent cookie)”。注意单位是:天;
3.创建一个cookie并设置 cookie的有效路径
$.cookie('the_cookie', 'the_value', { expires: 7, path: '/' });
在默认情况下,只有设置 cookie的网页才能读取该 cookie。如果想让一个页面读取另一个页面设置的cookie,必须设置cookie的路径。cookie的路径用于设置能够读取 cookie的顶级目录。将这个路径设置为网站的根目录,可以让所有网页都能互相读取 cookie (一般不要这样设置,防止出现冲突)。
4.读取cookie
$.cookie('the_cookie');
5.删除cookie
$.cookie('the_cookie', null); //通过传递null作为cookie的值即可
6.可选参数
$.cookie('the_cookie','the_value',{
expires:7,
path:'/',
domain:'jquery.com',
secure:true
})
参数
expires:(Number|Date)有效期;设置一个整数时,单位是天;也可以设置一个日期对象作为Cookie的过期日期;
path:(String)创建该Cookie的页面路径;
domain:(String)创建该Cookie的页面域名;
secure:(Booblean)如果设为true,那么此Cookie的传输会要求一个安全协议,例如:HTTPS;