好文章來自追風的小螞蟻:http://www.javashuo.com/article/p-tlkzlhqg-r.htmlhtml
cookie:Cookie,有時也用其複數形式 Cookies,指某些網站爲了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的鍵值對數據jquery
1.什麼是session?ajax
首先引入百度百科的解釋:Session:在計算機網絡應用中,稱爲「會話控制」。Session 對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web 頁時,若是該用戶尚未會話,則 Web 服務器將自動建立一個 Session 對象。當會話過時或被放棄後,服務器將終止該會話。Session 對象最多見的一個用法就是存儲用戶的首選項。例如,若是用戶指明不喜歡查看圖形,就能夠將該信息存儲在 Session 對象中。有關使用 Session 對象的詳細信息,請參閱「ASP 應用程序」部分的「管理會話」。注意 會話狀態僅在支持 cookie 的瀏覽器中保留。數據庫
個人理解: 服務器端爲了保存某些數據,或實現某些必要的功能,當用戶訪問服務器時,將數據臨時保存在服務器端以供完成服務器端的其餘某些功能。服務器須要保存的數據能夠以cookie的方式存儲在客戶端,而session的功能就是將服務器須要保存的數據存儲在服務端。例如帳號登陸記錄的功能,能夠以session的方式將登陸狀態保存在服務器端,這樣當用戶訪問其餘程序時,須要用到登陸的地方,均可以從該用戶的session中取出該用戶的數據,爲用戶服務。django
2.session和cookie的區別瀏覽器
session的底層是基於cookie技術來實現的,在早器保存會話狀態一直用的cookie,cookie是保存在客戶端的明文鍵值對,但這樣直接保存重要信息是不安全的,後來衍生了session,session是加密後的cookie鍵值,加密後的值即便被人截取,也沒法獲取到密碼等敏感信息,避免了重要資源信息泄露。當用戶打開瀏覽器,去訪問服務器的時候,服務器會爲每一個用戶的瀏覽器建立一個會話對象(session對象),而且爲每一個session對象建立一個Jsessionid號。當session對象建立成功後,會以cookie的方式將這個Jsessionid號回寫給瀏覽器,當用戶再次進行訪問服務器時,及帶了具備Jsessionid號的cookie數據來一塊兒訪問服務器,服務器經過不一樣session的 Jsessionid號來找出與其相關聯的session對象,經過不一樣的session對象來爲不一樣的用戶服務。緩存
3.在DJango中session的使用方法安全
Django中默認支持Session,其內部提供了5種類型的Session供開發者使用:服務器
·數據庫(默認)
·緩存
·文件
·緩存+數據庫
·加密cookiecookie
(1)數據庫中的Session
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,默認修改以後才保存(默認) b. 使用 def index(request): # 獲取、設置、刪除Session中數據 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在則不設置 del request.session['k1'] # 全部 鍵、值、鍵值對 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 用戶session的隨機字符串 request.session.session_key # 將全部Session失效日期小於當前日期的數據刪除 request.session.clear_expired() # 檢查 用戶session的隨機字符串 在數據庫中是否 request.session.exists("session_key") # 刪除當前用戶的全部Session數據 request.session.delete("session_key") request.session.clear() request.session.set_expiry(value) * 若是value是個整數,session會在些秒數後失效。 * 若是value是個datatime或timedelta,session就會在這個時間後失效。 * 若是value是0,用戶關閉瀏覽器session就會失效。 * 若是value是None,session會依賴全局session失效策略。
(2)緩存Session
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,默認修改以後才保存 b. 使用 同上
(3)文件Session
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T 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,默認修改以後才保存 b. 使用 同上
(4)緩存+數據庫Session
數據庫用於作持久化,緩存用於提升效率 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 b. 使用 同上
(5)加密Session
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 b. 使用 同上
(6)Session的用戶驗證
def login(func): def wrap(request, *args, **kwargs): # 若是未登錄,跳轉到指定頁面 if request.path == '/test/': return redirect('http://www.baidu.com') return func(request, *args, **kwargs) return wrap
利用sesssion作個用戶認證示例:
Views.py
from django.shortcuts import render,redirect,HttpResponse def login(request): if request.method=='GET': return render(request,'login.html') elif request.method=="POST": user=request.POST.get('username') pwd=request.POST.get('password') if user=="root" and pwd=="123": if request.POST.get('box')=="1": #checkbox被按下 request.session.set_expiry(10) #session認證時間爲10s,10s以後session認證失效 request.session['username']=user #user的值發送給session裏的username request.session['is_login']=True #認證爲真 return redirect('/index') else: return redirect('/login') return render(request,'login.html') def index(request): if request.session.get('is_login',None): #若session認證爲真 return render(request,'index.html',{'username':request.session['username']}) else: return HttpResponse('滾') def logout(request): #撤銷 request.session.clear() #刪除session裏的所有內容 return redirect('/login')
login.py
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/js/jquery-1.12.4.js"></script> <script src="/static/js/jquery.cookie.js"></script> </head> <body> <form action="/login/" method="post"> <p> <input type="text" name="username" placeholder="username" /> </p> <!----------CSRF_TOKEN經過form表單發送到後臺進行驗證----------> {% csrf_token %} <p> <input type="password" name="password" placeholder="password" /> </p> <p> <input type="checkbox" name="box" value="1" /> 10s超時 </p> <p> <input type="submit" value="提交" /> </p> <input type="button" id="btu-1" value="Ajax-1" /> </form> <script> $(function () { $.ajaxSetup({ beforeSend:function (xhr,settings) { xhr.setRequestHeader('X-CSRFtoken',$.cookie('csrftoken')) } }); $('#btu-1').click(function () { $.ajax({ url:"/login/", type:"POST", data:{'username':"root","password":"123"}, }) }) })()
index.py
<head> <meta charset="UTF-8"> <title>Title</title> </head> <h1>歡迎登陸:{{ username }},{{ request.session.username }}</h1> <a href="http://127.0.0.1:8006/logout/"><input type="button" value="註銷"/></a> </body> </html>