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。