cookie
-
什么是cookie? Cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据。浏览器须要保存这段数据,不得轻易删除。 此后每次浏览器访问该服务器,都必须带上这段数据html
-
cookie的原理 由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能经过Cookie的内容来判断这个是“谁”了python
-
cookie的做用是什么?redis
- 识别用户身份
- 记录历史
-
使用方法数据库
- 设置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的优缺点 优势:数据存储在客户端。减轻服务端的压力,提升网站的性能 缺点:安全性不高,在客户端很容易被查看或破解用户会话信息django
-
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:服务器
- response.session['key'] = value
- response.session.setdefault('key', 'value')
-
获取sessioncookie
- 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失效策略。
-
可以使用django-redis模块进行session和cache操做,相关配置以下
# 使用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 的区别:
一、cookie数据存放在客户的浏览器上,session数据放在服务器上。
二、cookie不是很安全,别人能够分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。
三、session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE。
四、单个cookie保存的数据不能超过4K,不少浏览器都限制一个站点最多保存20个cookie。