cookie
- 什么是cookie?
Cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据。浏览器需要保存这段数据,不得轻易删除。 此后每次浏览器访问该服务器,都必须带上这段数据 - cookie的原理
由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了 - cookie的作用是什么?
- 识别用户身份
- 记录历史
- 使用方法
- 设置cookie:
- response.set_cookie('key', 'value')
- response.set_signed_cookie(key, value, salt='', max_age=None, ...)
参数- key, 键
- value, 值
- max_age=None,超时时间
- expires=None, 超时时间(IE浏览器)
- path='/', cookie生效的路径。特殊的:根路径的cookie可以被任何url的页面访问
- domain=None, Cookie生效的域名
- secure=False, https传输
- httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖
- 获取cookie:
- request.COOKIES.get('key')
- request.COOKIES['key']
- request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
- 删除cookie: response.delete_cookie("cookie_key",path="/",domain=name)
- 设置cookie:
cookie的优缺点
优点:数据存储在客户端。减轻服务端的压力,提高网站的性能
缺点:安全性不高,在客户端很容易被查看或破解用户会话信息- cookie版登录校验
def check_login(func):
@wraps(func)
def inner(request, *args, **kwargs):
next_url = request.get_full_path()
if request.get_signed_cookie("login", salt="SSS", default=None) == "yes":
# 已经登录的用户...
return func(request, *args, **kwargs)
else:
# 没有登录的用户,跳转刚到登录页面
return redirect("/login/?next={}".format(next_url))
return inner
def login(request):
if request.method == "POST":
username = request.POST.get("username")
passwd = request.POST.get("password")
if username == "xxx" and passwd == "dashabi":
next_url = request.GET.get("next")
if next_url and next_url != "/logout/":
response = redirect(next_url)
else:
response = redirect("/class_list/")
response.set_signed_cookie("login", "yes", salt="SSS")
return response
return render(request, "login.html")
session
什么是session
由于cookie存放在用户浏览器上,所以如果将一些重要数据存在cookie中就会造成安全隐患,且浏览器中cookie有大小限制,最大4K,所以使用session,将重要数据保存在服务器端,使用cookie将sessionid存放在浏览器中,访问服务器是自动带上sessionid,服务器根据sessionid进行判断用户是谁。- 使用方法
- 设置session:
- request.session['key'] = value
- reqeust.session.setdefault('key', 'value')
- 获取session
- request.session.get('key', None)
- request.session['key']
删除session
- del request.session['key']
- 其他方法
- request.session.keys()
- request.session.values()
- request.session.items()
- request.session.iterkeys()
- request.session.itervalues()
- request.session.iteritems()
- request.session.session_key 会话session的key
- request.session.clear_expired() 将所有Session失效日期小于当前日期的数据删除
- request.session.exists("session_key") 检查会话session的key在数据库中是否存在
- request.session.delete() 删除当前会话的所有Session数据
- request.session.flush() 删除当前的会话数据并删除会话的Cookie
- request.session.set_expiry(value)
- 如果value是个整数,session会在些秒数后失效。
- 如果value是个datatime或timedelta,session就会在这个时间后失效。
- 如果value是0,用户关闭浏览器session就会失效。
- 如果value是None,session会依赖全局session失效策略。
- 设置session:
# 使用redis作为Django缓存数据库
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://localhost:6379/3",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 使用redis存储session。
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。