知識內容:html
1.cookie數據庫
2.sessiondjango
3.flask中的cookie和sessionflask
4.Django中的cookie和session瀏覽器
參考:http://www.cnblogs.com/liwenzhou/p/8343243.html緩存
1、cookie安全
1.cookie由來服務器
由於http請求是無狀態的,每一次請求是獨立的(對於服務端來講,一切均如初見!),很難實現保存狀態cookie
2.cookie是什麼session
Cookie具體指的是一段小信息,它是服務器發送出來存儲在瀏覽器上的一組組鍵值對,下次訪問服務器時瀏覽器會自動攜帶這些鍵值對,以便服務器提取有用信息
cookie說簡單點就是保持在瀏覽器上的鍵值對,服務端控制着響應,在響應裏可讓瀏覽器在本地保存這個鍵值對(cookie),下次請求的時候發送的時候自動攜帶這個cookie
注意:cookie是服務端設置,可是瀏覽器(客戶端)能夠設置cookie(禁用cookie),另外cookie默認關閉瀏覽器就失效
例如:
1 cookie: _ga=GA1.2.1054004464.1521898033; __gads=ID=e13aa7dde32c5592:T=1526655541:S=ALNI_MZZ6P4iXCRX7EKM9IiKRBTv75Txmw; uaid=2b0dae04996e4d1b9de87d71f6f08088; .CNBlogsCookie=BEA8AC1412C8986DF38732BCAA2D291BAB1AAF7C686923F855A33A923BB8C8F6BE2F84B80CFEC7BBE6A83F23B865AB87D25FED9E10640E1E34269A641C1B0562C85CDD083B46DCC63FC52BF67D409F90936DAD38; .Cnblogs.AspNetCore.Cookies=CfDJ8FHXRRtkJWRFtU30nh_M9mCEXAQL_UyHvUyPS0oSzb3-whvexkm5XnGWepX0a6XLb-6kRfEDb1UgmfX2cmCIy2xLqCn3X8EAAV8GHySMlOc8vyx-_rBZXSgdfdyeUxliaVUUrljH5Y0Y6kO8I4qfemj7rSEWL9COZzWaOwNWlqGYE0Y55r1TUkAZ6W7ZVgsIaeatSFrSEBcsdvF8NdmsWLkPapTH_8qegCV1Sp3beSdaymrdZ4WPiSa1PGGT6jyr-l-Ddt2tKQzrYB_Txu16wSbZqe_xWD1GNATahXlw6AA1qn-sZz9NmkxTuLVvPOaF9Q; _gid=GA1.2.1318394338.1528273714
如何在瀏覽器上查看cookie(以谷歌瀏覽器爲例):
選擇頁面右鍵點開選項選擇檢查,以下選擇便可:
cookie從服務器發送到客戶端的具體原理:在服務器發送給客戶端的響應中若是有一個字段Set-Cookie,瀏覽器將會保存這個Set-Cookie對應的值,在下次向瀏覽器請求時帶上這個值
3.cookie應用
問題來了,基於HTTP協議的無狀態特徵,服務器根本就不知道訪問者是「誰」。那麼cookie就起到橋接的做用
咱們能夠給每一個客戶端的cookie分配一個惟一的id,這樣用戶在訪問時,經過cookie,服務器就知道來的人是「誰」。而後咱們再根據不一樣的cookie的id,在服務器上保存一段時間的私密資料,如「帳號密碼」等等
具體應用場景以下:
1 登陸、七天免登陸 2 記錄用戶的瀏覽習慣 3 簡單的投票限制
2、session
1.session的由來
cookie雖然在必定程度上解決了「保持狀態」的需求,可是因爲cookie自己最大支持4096字節,以及cookie自己保存在客戶端,可能被攔截或竊取,所以就須要有一種新的東西,它能支持更多的字節,而且他保存在服務器,有較高的安全性。這就是session
2.session是什麼
session:保存在服務端的鍵值對
session必須依賴cookie,以下所示:
3. cookie和session比較
cookie:存儲數據小、安全性差
session:存儲數據大、安全性好
總結而言:cookie彌補了HTTP無狀態的不足,讓服務器知道來的人是「誰」;可是cookie以文本的形式保存在本地,自身安全性較差;因此咱們就經過cookie識別不一樣的用戶,對應的在session裏保存私密的信息以及超過4096字節的文本
另外,上述所說的cookie和cookie實際上是共通性的東西,不限於語言和框架。
3、flask中的cookie和session
(1)flask的cookie
1 # flask寫入 cookie, 必須使用 make_response 函數 2 # 而後再用 set_cookie 來設置 cookie 3 r = make_response(template) 4 r.set_cookie('cookie_name', 'wyb') 5 return r
(2)flask的session
flask中有一個 session 對象。它容許你在不一樣請求間存儲特定用戶的信息。它是在 Cookies 的基礎上實現的,而且對 Cookies 進行密鑰簽名要使用會話,你須要設置一個密鑰:
基本使用(沒有登陸就讓其登陸,登陸了頁面顯示登陸成功,點擊logout註銷回到登陸頁面):
1 from flask import Flask, session, redirect, url_for, escape, request 2 3 app = Flask(__name__) 4 # set the secret key. keep this really secret: 5 app.secret_key = 'abcdefghyjklmnopqrstasdfu280975298165=-' 6 7 # escape(session['username']), session.get("username", None)是兩種取session中值的方法 8 @app.route('/') 9 def index(): 10 if 'username' in session: 11 return 'Logged in as %s(%s), %s' % (escape(session['username']), session.get("username", None), "<a href='/logout'>註銷</a>") 12 return redirect(url_for("login")) 13 14 @app.route('/login', methods=['GET', 'POST']) 15 def login(): 16 if request.method == 'POST': 17 session['username'] = request.form['username'] 18 return redirect(url_for('index')) 19 return ''' 20 <form action="" method="post"> 21 <p><input type=text name=username> 22 <p><input type=submit value=Login> 23 </form> 24 ''' 25 26 @app.route('/logout') 27 def logout(): 28 # remove the username from the session if it's there 29 session.pop('username', None) 30 return redirect(url_for('login')) 31 32 if __name__ == '__main__': 33 app.run(debug=True)
4、Django中的cookie和session
(1) django中的cookie
1 # Cookie: 保存在瀏覽器端的鍵值對 2 3 # 爲何要有Cookie: 由於HTTP請求是無狀態的 4 5 # Cookie的原理: 6 """ 7 服務端能夠在返回響應的時候 作手腳 8 在瀏覽器上寫入鍵值對(Cookie) 9 10 瀏覽器發送請求的時候會自動攜帶該網站保存在我瀏覽器的鍵值對(Cookie) 11 """ 12 13 # Django 從請求攜帶的Cookie中取值: 14 request.COOKIES.get("is_login") 15 request.get_signed_cookie(key, default=None, salt="xxx") 16 # Django中設置Cookie:(針對的是響應對象) 17 rep = HttpResponse()/render(request, "test.html)/redirect() 18 rep.set_cookie(key, value) 19 # rep.set_signed_cookie(key, value, salt="xxx", max_age=7) 20 # Django中刪除Cookie:(註銷) 21 rep.delete_cookie(key)
刪除cookie實現註銷:
1 def logout(request): 2 rep = redirect("/login/") 3 rep.delete_cookie("user") # 刪除用戶瀏覽器上以前設置的usercookie值 4 return rep
cookie實現登錄驗證:
1 def check_login(func): 2 @wraps(func) 3 def inner(request, *args, **kwargs): 4 next_url = request.get_full_path() 5 if request.get_signed_cookie("login", salt="SSS", default=None) == "yes": 6 # 已經登陸的用戶... 7 return func(request, *args, **kwargs) 8 else: 9 # 沒有登陸的用戶,跳轉剛到登陸頁面 10 return redirect("/login/?next={}".format(next_url)) 11 return inner 12 13 14 def login(request): 15 if request.method == "POST": 16 username = request.POST.get("username") 17 passwd = request.POST.get("password") 18 if username == "xxx" and passwd == "xxx": 19 next_url = request.GET.get("next") 20 if next_url and next_url != "/logout/": 21 response = redirect(next_url) 22 else: 23 response = redirect("/index/") 24 response.set_signed_cookie("login", "yes", salt="xxx") 25 return response 26 return render(request, "login.html")
(2)django中的session
1 # Session保存在服務端的鍵值對,另外Session依賴於Cookie 2 3 """ 4 Session原理: 5 用戶數據: 6 xasdfvxs: {"is_login": 1, "name": "xiaohei", "age":18} 7 safsdfsdf: {"is_login": 1, "name": "xiaobai", "age":20} 8 wergasfd: {"is_login": 0, "name": "xiaohui", "age":48} 9 10 給瀏覽器寫入Cookie: 11 sessionid: wergasfd 12 13 1. 從用戶發來的請求的Cookie中 根據 sessionid 取值, 取到一個隨機字符串 14 2. 根據這個隨機字符串找到對應的 Session 數據 --> {"is_login": 0, "name": "xiaohui", "age":48} 15 3. request.session.get("is_login") --> 從Session取值 16 """ 17 18 19 # Django中設置Session: 20 request.session["is_login"] = 1 21 22 # Django設置session和cookie的超時時間 (Cookie和Session數據的) 23 request.session.set_expiry(7) 24 # 若是value是個整數,session會在些秒數後失效。 25 # 若是value是個datatime或timedelta,session就會在這個時間後失效。 26 # 若是value是0,用戶關閉瀏覽器session就會失效。 27 # 若是value是None,session會依賴全局session失效策略。 28 29 # Django中取出session中的值 30 request.session.get("is_login") 31 32 # 在settings.py中設置,每次請求都刷新Session超時時間 33 SESSION_SAVE_EVERY_REQUEST = True 34 35 # Django中刪除Session: 36 request.session.delete() # 只刪除session 37 request.session.flush() # 清除Cookie和Session數據 38 request.session.clear_expired() 將全部Session失效日期小於當前日期的數據刪除
(3)django中的session配置
1 1. 數據庫Session 2 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認) 3 4 2. 緩存Session 5 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 6 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置 7 8 3. 文件Session 9 SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 10 SESSION_FILE_PATH = None # 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() 11 12 4. 緩存+數據庫 13 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 14 15 5. 加密Cookie Session 16 SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 17 18 其餘公用設置項: 19 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認) 20 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認) 21 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認) 22 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認) 23 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認) 24 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認) 25 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過時(默認) 26 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存(默認) 27 28 Django中Session相關設置
(4)Django中CBV使用裝飾器實現登錄驗證
要在CBV視圖中使用咱們上面的check_login裝飾器,須要使用如下的django內置的方法:
1 from django.utils.decorators import method_decorator
固然關於這個方法的使用有如下三種方式:
1. 加在CBV視圖的get或post方法上:
1 from django.utils.decorators import method_decorator 2 3 class HomeView(View): 4 def dispatch(self, request, *args, **kwargs): 5 return super(HomeView, self).dispatch(request, *args, **kwargs) 6 7 def get(self, request): 8 return render(request, "home.html") 9 10 @method_decorator(check_login) 11 def post(self, request): 12 print("Home View POST method...") 13 return redirect("/index/")
2. 加在dispatch方法上:
1 from django.utils.decorators import method_decorator 2 3 class HomeView(View): 4 @method_decorator(check_login) 5 def dispatch(self, request, *args, **kwargs): 6 return super(HomeView, self).dispatch(request, *args, **kwargs) 7 8 def get(self, request): 9 return render(request, "home.html") 10 11 def post(self, request): 12 print("Home View POST method...") 13 return redirect("/index/") 14 15 # 由於CBV中首先執行的就是dispatch方法,因此這麼寫至關於給get和post方法都加上了登陸校驗
3. 直接加在視圖類上:
1 # 若是get方法和post方法都須要登陸校驗的話就寫兩個裝飾器 2 # 注意method_decorator必須傳name關鍵字參數 3 4 from django.utils.decorators import method_decorator 5 6 @method_decorator(check_login, name="get") 7 @method_decorator(check_login, name="post") 8 class HomeView(View): 9 def dispatch(self, request, *args, **kwargs): 10 return super(HomeView, self).dispatch(request, *args, **kwargs) 11 12 def get(self, request): 13 return render(request, "home.html") 14 15 def post(self, request): 16 print("Home View POST method...") 17 return redirect("/index/")