cookie機制html
在程序中,會話跟蹤是很重要的事情。理論上,一個用戶的全部請求操做都應該屬於同一個會話,而另外一個用戶的全部請求操做則應該屬於另外一個會話,兩者不能混淆. 而Web應用程序是使用HTTP協議傳輸數據的。HTTP協議是無狀態的協議。一旦數據交換完畢,客戶端與服務器端的鏈接就會關閉,再次交換數據須要創建新的鏈接。這就意味着服務器沒法從鏈接上跟蹤會話。要跟蹤該會話,必須引入一種機制。jquery
Cookie就是這樣的一種機制。它能夠彌補HTTP協議無狀態的不足。在Session出現以前,基本上全部的網站都採用Cookie來跟蹤會話。數據庫
Cookie其實是一小段的文本信息。客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還能夠根據須要修改Cookie的內容。django
瀏覽器下的cookie:瀏覽器
request.COOKIES['key'] #表明客戶端發送的所有cookie,以鍵值對方式存儲,能夠理解爲一個字典 request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) #參數: default: 默認值 salt: 加密鹽 max_age: 後臺控制過時時間 request.COOKIES['key'] #key存在則獲取,不存在則報錯,不建議使用 request.COOKIES.get('key') #獲取cookie,不存在返回None,建議使用
#建立響應對象 response=render(request,'index.html') response=redirect('index') #設置cookie response.set_cookie('key',value) #默認關閉瀏覽器就失效 response.set_signed_cookie(key,value,salt='加密鹽',...) #設置帶簽名的cookie 其餘參數: key, 鍵 value='', 值 max_age=None, cookie失效時間,單位秒 expires=None, cookie失效時間戳(IE requires expires, so set it if hasn't been already.),參數datetime對象 path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:跟路徑的cookie能夠被任何url的頁面訪問 domain=None, Cookie生效的域名 secure=False, https傳輸 httponly=False 只能http協議傳輸,沒法被JavaScript獲取(不是絕對,底層抓包能夠獲取到也能夠被覆蓋
帶簽名的cookie:設置時候加簽,cookie內容是加密的緩存
因爲cookie保存在客戶端的電腦上,因此,JavaScript和jquery也能夠操做cookie。安全
<script src='/static/js/jquery.cookie.js'> </script> $.cookie("key", value,{ path: '/' });
response.delete_cookie("cookie_key",path="/",domain=name)
cookie存儲到客戶端服務器
優勢:cookie
數據存在在客戶端,減輕服務器端的壓力,提升網站的性能。session
缺點:
安全性不高:在客戶端機很容易被查看或破解用戶會話信息
由於因特網HTTP協議的特性,每一次來自於用戶瀏覽器的請求(request)都是無狀態的、獨立的。通俗地說,就是沒法保存用戶狀態,後臺服務器根本就不知道當前請求和之前及之後請求是否來自同一用戶。
爲了實現鏈接狀態的保持功能,網站會經過用戶的瀏覽器在用戶機器內被限定的硬盤位置中寫入一些數據,也就是所謂的Cookie。經過Cookie能夠保存一些諸如用戶名、瀏覽記錄、表單記錄、登陸和註銷等各類數據。可是這種方式很是不安全,由於Cookie保存在用戶的機器上,若是Cookie被僞造、篡改或刪除,就會形成極大的安全威脅,所以,現代網站設計一般將Cookie用來保存一些不重要的內容,實際的用戶數據和狀態仍是以Session會話的方式保存在服務器端。
Session依賴Cookie!但與Cookie不一樣的地方在於Session將全部的數據都放在服務器端,用戶瀏覽器的Cookie中只會保存一個非明文的識別信息,好比哈希值。
Django提供了一個通用的Session框架,而且可使用多種session數據的保存方式:
保存在數據庫內
保存到緩存
保存到文件內
保存到cookie內
一般狀況,沒有特別需求的話,請使用保存在數據庫內的方式,儘可能不要保存到Cookie內。
Django的session框架默認啓用,並已經註冊在app設置內,若是真的沒有啓用,那麼參考下面的內容添加有說明的那兩行,再執行migrate命令建立數據表,就可使用session了。
當session啓用後,傳遞給視圖request參數的HttpRequest對象將包含一個session屬性,就像一個字典對象同樣。你能夠在Django的任何地方讀寫request.session屬性,或者屢次編輯使用它。
1、設置Sessions值 request.session['session_name'] ="admin" 2、獲取Sessions值 session_name = request.session["session_name"] 3、刪除Sessions值 del request.session["session_name"] 4、檢測是否操做session值 if "session_name" is request.session :
五、get(key, default=None) fav_color = request.session.get('fav_color', 'red') 6、pop(key) fav_color = request.session.pop('fav_color') 7、keys() 8、items() 9、setdefault() 10、flush() 刪除當前的會話數據並刪除會話的Cookie。 這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問 例如,django.contrib.auth.logout() 函數中就會調用它。 11 用戶session的隨機字符串 request.session.session_key # 將全部Session失效日期小於當前日期的數據刪除 request.session.clear_expired() # 檢查 用戶session的隨機字符串 在數據庫中是否 request.session.exists("session_key") # 刪除當前用戶的全部Session數據 request.session.delete("session_key") request.session.set_expiry(value) * 若是value是個整數,session會在些秒數後失效。 * 若是value是個datatime或timedelta,session就會在這個時間後失效。 * 若是value是0,用戶關閉瀏覽器session就會失效。 * 若是value是None,session會依賴全局session失效策略。
def log_in(request): if request.method=="POST": username=request.POST['user'] password=request.POST['pwd'] user=UserInfo.objects.filter(username=username,password=password) if user: #設置session內部的字典內容 request.session['is_login']='true' request.session['username']=username #登陸成功就將url重定向到後臺的url return redirect('/backend/') #登陸不成功或第一訪問就停留在登陸頁面 return render(request,'login.html') def backend(request): print(request.session,"------cookie") print(request.COOKIES,'-------session') """ 這裏必須用讀取字典的get()方法把is_login的value缺省設置爲False, 當用戶訪問backend這個url先嚐試獲取這個瀏覽器對應的session中的 is_login的值。若是對方登陸成功的話,在login裏就已經把is_login 的值修改成了True,反之這個值就是False的 """ is_login=request.session.get('is_login',False) #若是爲真,就說明用戶是正常登錄的 if is_login: #獲取字典的內容並傳入頁面文件 cookie_content=request.COOKIES session_content=request.session username=request.session['username'] return render(request,'backend.html',locals()) else: """ 若是訪問的時候沒有攜帶正確的session, 就直接被重定向url回login頁面 """ return redirect('/login/') def log_out(request): """ 直接經過request.session['is_login']回去返回的時候, 若是is_login對應的value值不存在會致使程序異常。因此 須要作異常處理 """ try: #刪除is_login對應的value值 del request.session['is_login'] # OR---->request.session.flush() # 刪除django-session表中的對應一行記錄 except KeyError: pass #點擊註銷以後,直接重定向回登陸頁面 return redirect('/login/')
===================================login.html================== <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post"> <p>用戶名: <input type="text" name="user"></p> <p>密碼: <input type="password" name="pwd"></p> <p><input type="submit"></p> </form> </body> </html> ===================================backend.html================== <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>hello {{ username }}</h3> <a href="/logout/">註銷</a> </body> </html>
1)數據庫配置(默認)
Django默認支持Session,而且默認是將Session數據存儲在數據庫中,即:django_session 表中。 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過時(默認) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存(默認)
2)緩存配置
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過時 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存
3)文件配置
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過時 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存
服務器是如何判斷你已經登陸的呢。那就是用的cookie或者session功能。
cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在服務器端保持狀態的方案。
同時咱們也看到,因爲採用服務器端保持狀態的方案在客戶端也須要保存一個標識,因此session機制可能須要藉助於cookie機制來達到保存標識的目的,但實際上它還有其餘選擇。
一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session。
三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能,考慮到減輕服務器性能方面,應當使用COOKIE。
四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。
一、自動生成一段字符串
二、將字符串發送到客戶端的瀏覽器,同時把字符串當作key放在session裏。(能夠理解爲session就是一個字典)
三、在用戶的session對應的value裏設置任意值