一、Cookie Cookie,有時也用其複數形式 Cookies,指某些網站為了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。 1. 應用 伺服器可以利用Cookies包含信息的任意性來篩選並經常性維護這些信息,以判斷在HTTP傳輸中的狀態。 Cookies ...
一、Cookie
Cookie,有時也用其複數形式 Cookies,指某些網站為了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。
1. 應用
- 伺服器可以利用Cookies包含信息的任意性來篩選並經常性維護這些信息,以判斷在HTTP傳輸中的狀態。
- Cookies最典型的應用是判定註冊用戶是否已經登錄網站,用戶可能會得到提示,是否在下一次進入此網站時保留用戶信息以便簡化登錄手續,這些都是Cookies的功用。
- 另一個重要應用場合是“購物車”之類處理。用戶可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些信息都會寫入Cookies,以便在最後付款時提取信息。
2. 獲取Cookie
1 #獲取普通Cookie 2 request.COOKIES['key'] 3 4 #獲取簽名Cookie 5 request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 6 參數: 7 default: 預設值 8 salt: 加密鹽 9 max_age: 後臺控制過期時間
3. 設置Cookie
#先獲取views函數的返回對象 rep = HttpResponse(...) 或 rep = render(request, ...) #設置普通Cookie,鍵值對 rep.set_cookie(key,value,...) #設置簽名Cookie rep.set_signed_cookie(key,value,salt='加密鹽',...) 參數: key, 鍵 value='', 值 max_age=None, 超時時間 expires=None, 超時時間(IE requires expires, so set it if hasn't been already.) path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:跟路徑的cookie可以被任何url的頁面訪問 domain=None, Cookie生效的功能變數名稱 secure=False, https傳輸 httponly=False 只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)
4. 操作Cookie
由於Cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。
<script src='/static/js/jquery.cookie.js'></script> $.cookie("list_pager_num", 30,{ path: '/' });
5. 應用Cookie進行用戶登陸狀態保持
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from django.shortcuts import render, HttpResponse, redirect 2 3 4 #Cookie登陸驗證裝飾器 5 def auth(func): 6 def wrapper(request): 7 tk = request.COOKIES.get('login_keys') # 根據鍵獲取cookies 8 if not tk: # 若cookie不存在,跳轉至登陸頁面 9 return redirect('/login.html/') 10 else: 11 return func(request) # 否則,執行當前url 12 return wrapper 13 14 15 16 #登陸驗證,登陸成功則返回客戶端Cookie 17 def login(request): 18 if request.method == 'GET': 19 return render(request, 'login.html') 20 else: 21 user_name = request.POST.get('user') # 獲取用戶名 22 user_pwd = request.POST.get('pwd') # 獲取用戶密碼 23 if user_name == 'jack' and user_pwd == '123': # 若用戶名和密碼匹配 24 obj_cookie = HttpResponse('登陸成功!') 25 obj_cookie.set_cookie('login_keys', '123456', max_age=3600) # 設置Cookie,有效期1小時 26 return obj_cookie 27 else: 28 return HttpResponse('密碼錯誤') 29 30 31 @auth 32 def index(request): 33 return HttpResponse('welcome to index')基於Cookie的登陸驗證
二、Session
不同於Cookie,Session是保存在伺服器端的會話數據。
在電腦中,尤其是在網路應用中,稱為“會話控制”。Session 對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程式的 Web 頁之間跳轉時,存儲在 Session 對象中的變數將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程式的 Web 頁時,如果該用戶還沒有會話,則 Web 伺服器將自動創建一個 Session 對象。當會話過期或被放棄後,伺服器將終止該會話。Session 對象最常見的一個用法就是存儲用戶的首選項。例如,如果用戶指明不喜歡查看圖形,就可以將該信息存儲在 Session 對象中。
Django中預設支持Session,其內部提供了5種類型的Session供開發者使用:
- 資料庫(預設)
- 緩存
- 文件
- 緩存+資料庫
- 加密cookie
1. 資料庫Session
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 Django預設支持Session,並且預設是將Session數據存儲在資料庫中,即:django_session 表中。 2 3 a. 配置 settings.py 4 5 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(預設) 6 7 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字元串(預設) 8 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(預設) 9 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的功能變數名稱(預設) 10 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(預設) 11 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(預設) 12 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(預設) 13 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期(預設) 14 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,預設修改之後才保存(預設) 15 16 17 18 b. 使用 19 20 def index(request): 21 # 獲取、設置、刪除Session中數據 22 request.session['k1'] 23 request.session.get('k1',None) 24 request.session['k1'] = 123 25 request.session.setdefault('k1',123) # 存在則不設置 26 del request.session['k1'] 27 28 # 所有 鍵、值、鍵值對 29 request.session.keys() 30 request.session.values() 31 request.session.items() 32 request.session.iterkeys() 33 request.session.itervalues() 34 request.session.iteritems() 35 36 37 # 用戶session的隨機字元串 38 request.session.session_key 39 40 # 將所有Session失效日期小於當前日期的數據刪除 41 request.session.clear_expired() 42 43 # 檢查 用戶session的隨機字元串 在資料庫中是否 44 request.session.exists("session_key") 45 46 # 刪除當前用戶的所有Session數據 47 request.session.delete("session_key") 48 49 request.session.set_expiry(value) 50 * 如果value是個整數,session會在些秒數後失效。 51 * 如果value是個datatime或timedelta,session就會在這個時間後失效。 52 * 如果value是0,用戶關閉瀏覽器session就會失效。 53 * 如果value是None,session會依賴全局session失效策略。資料庫Session
2. 緩存Session
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 a. 配置 settings.py 2 3 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 4 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(預設記憶體緩存,也可以是memcache),此處別名依賴緩存的設置 5 6 7 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字元串 8 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑 9 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的功能變數名稱 10 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie 11 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸 12 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) 13 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期 14 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,預設修改之後才保存 15 16 17 18 b. 使用 19 20 同上緩存Session
3. 文件Session
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 a. 配置 settings.py 2 3 SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 4 SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T 5 6 7 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字元串 8 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑 9 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的功能變數名稱 10 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie 11 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸 12 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) 13 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期 14 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,預設修改之後才保存 15 16 b. 使用 17 18 同上文件Session
4. 緩存+資料庫Session
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 資料庫用於做持久化,緩存用於提高效率 2 3 a. 配置 settings.py 4 5 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 6 7 b. 使用 8 9 同上緩存提高效率,資料庫保持持久
5. 加密cookie Session
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 b. 使用 同上
6. 應用Session進行用戶登陸狀態保持
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from django.shortcuts import render, HttpResponse, redirect 2 3 4 #Session登陸驗證裝飾器 5 def auth(func): 6 def wrapper(request): 7 tk = request.session.get('user') # 根據鍵獲取session 8 if not tk: # 若session不存在,跳轉至登陸頁面 9 return redirect('/login.html/') 10 else: 11 return func(request) # 否則,執行當前url 12 return wrapper 13 14 15 16 #登陸驗證 17 def login(request): 18 if request.method == 'GET': 19 return render(request, 'login.html') 20 else: 21 user_name = request.POST.get('user') # 獲取用戶名 22 user_pwd = request.POST.get('pwd') # 獲取用戶密碼 23 if user_name == 'jack' and user_pwd == '123': # 若用戶名和密碼匹配 24 request.session['user'] = user_name # 寫當前用戶至session中 25 request.session.set_expiry(3600) # 設置session,有效期1小時 26 return redirect('/index.html/') 27 else: 28 return HttpResponse('密碼錯誤') 29 30 31 @auth 32 def index(request): 33 return HttpResponse('welcome to index')基於Session的登陸狀態驗證
參考資料:
1. http://www.cnblogs.com/wupeiqi/articles/5246483.html
2. http://baike.baidu.com/item/Cookies/187064
3. http://baike.baidu.com/item/session/479100