1. 程式人生 > >Cookies 和session

Cookies 和session

一 會話跟蹤

  在一個會話的多個請求中共享資料,這就是會話跟蹤技術
  • 請求登入(請求引數是使用者名稱和密碼);
  • 請求轉賬(請求引數與轉賬相關的資料); 
  • 請求信譽卡還款(請求引數與還款相關的資料)。 

  

  登入資訊在這個會話中是資料共享的,如果登入的是張三,那麼在轉賬和還款時一定是相對張三的轉賬和還款!這就說明
我們必須在一個會話過程中有共享資料的能力。

 

二 cookies篇

  1  cookie簡單定義 

1 cookie是在HTTP中它表示伺服器送給客戶端瀏覽器的小甜點。
2 key-value結構;
3 由伺服器建立;
4 瀏覽器儲存cookie

  2 cookie執行流程

1 瀏覽器首次post 請求瀏覽器的時候回攜帶一個空的cookie :{}

2 如果操作驗證通過(登入成功)後,伺服器建立一個cookie :{key:value},作為響應頭的一部分傳給瀏覽器.

3 瀏覽器下次訪問網頁的時候帶著 ,這個建立好的cookie:{key:value}請求,伺服器檢視cookie資訊,如果cookie
 存在,則放行,否則攔截.

  3 cookie規範

注意 :
    瀏覽器之間是不能進行共享cookie的;
    也就是說在你使用IE訪問伺服器時,伺服器會把Cookie發給IE,然後由IE儲存起來,當你在使用FireFox訪問
伺服器時,不可能把IE儲存的Cookie傳送給伺服器。

  4 cookie 與Http頭 -----------cookie 是通過HTTP請求和響應頭在客戶端和服務端進行傳遞的;

    4.1 cookie:請求頭,客戶端發給伺服器; 首次post請求cookie為空

 格式:cookie:a=A;b=B;c=C.多個cookie用';'隔開;

    4.2  set_cookie:響應頭 ,伺服器傳送給客戶端

    格式:一個cookie物件一個set-cookie:
         如:set-cookie:a=A  set-cookie:b=B set-cookie:c=C

  5 cookie覆蓋

如果伺服器傳送重複的cookie,那麼會覆蓋原有的cookie;
如 :
    第一次:Set-Cookie: a=A;
    第二次:Set-Cookie: a=AA
則最後客戶端留下的cookie是 cookie:a=AA。 

  6 django中的cookie語法

    6.1服務端在驗證通過後,設定cookie

rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect()

#rep是響應物件,只有相應物件才有.set_cookie方法

rep.set_cookie(key,value) #一次只能繫結一個cookie鍵值對

rep.set_signed_cookie(key,value,salt='加密鹽')  #加密方式繫結cookie鍵值對

 

  6.2 再次登入,獲取cookie資訊,進行驗證

value=request.COOKIES('key') #獲取cookie中鍵為key的值

  6.3 刪除cookie

response.delete_cookie("key") #刪除cookie中key的那個鍵值對

   7 例項程式碼

def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    else:
        user=request.POST.get('user')
        pwd=request.POST.get('pwd')
        user_obj=models.UserInfo.objects.filter(user=user,pwd=pwd).filter()
        if user_obj:
            res_obj=redirect('/index/')
            res_obj.set_cookie("is_login",True,max_age=20)
            res_obj.set_cookie("user",user)
            return res_obj
        return HttpResponse('賬戶或者密碼錯誤')
login cookies

 

三session篇

1 session 技術

1 給使用者的瀏覽器建立一個獨享的session物件;

2 每個瀏覽器都開闢獨有的session資源;

3 使用者再去訪問該伺服器中的其它web資源時,其它web資源再從使用者各自的session中 取出資料為使用者服務.

2 session 流程

 

3 django 中的session語法,結合session流程講解

  3.1 設定session

request.session['is_login']=True

    3.1.1設定session 執行流程

    if not 獲取鑰匙(sessionid):
        1 給瀏覽器建立隨機字串sessionid;
        2 在django-sesion表下建立一條記錄(代表一個客戶端瀏覽器);
        3 響應set_cookie("sessionid",隨機的字串),傳送給客戶端;
    else:
        1 在django-sesion表下設定一條記錄(代表一個客戶端瀏覽器)
        2 更新記錄
設定session流程

  3.2 獲取session值 

session_name = request.session["session_name"]

    3.2.1設定session 執行流程

1 去鑰匙
    2 去django-session表中獲取對應記錄物件
    3 通過物件取出is_login這個鍵對應的值
獲取settion值的流程

  3.3 刪除session的值

del request.session["session_name"]

    3.3.1 獲取session執行流程

request.session.get("is_login")的實現:

1 取鑰匙;

2 去django-session表中獲取對應記錄物件

3 通過物件取出is_login這個鍵對應的值
刪除session值的流程

  3.4 刪除session 

request.session.flush()

    3.4.1刪除session執行流程

1 取sessionid鑰匙

2 取django-session表中獲取對應的記錄;

3 刪除對應的記錄
flush 流程