cookie和session

知識內容: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(以谷歌瀏覽器爲例):

選擇頁面右鍵點開選項選擇檢查,以下選擇便可:

 

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 進行密鑰簽名要使用會話,你須要設置一個密鑰:

  • 設置:session['username'] = 'xxx'
  • 取出session值:session.get('username', None)
  • 刪除:session.pop('username', None)

基本使用(沒有登陸就讓其登陸,登陸了頁面顯示登陸成功,點擊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/")
相關文章
相關標籤/搜索