cookie 驗證 ,session


 

登錄的時候,先進入login頁面,驗證成功后,跳轉到index頁面,

那現在我不登錄,直接輸入index頁面的url,也可以直接看到index頁面,那登錄的頁面的就沒有作用了,

所以想看index頁面,必須先做登錄驗證,就要用到cookie,

cookie 是 存在客戶端的多組的鍵值對,記錄登錄狀態,

http協議是無狀態協議,不會記錄登錄的狀態,

那cookie就是記錄上次的登錄狀態,有這個狀態,就直接顯示登錄成功后的頁面

當客戶端第一次登錄服務端的時候,登錄成功后,服務端隨機創建給客戶端一個字典,

鍵是隨機的字符串,根據用戶名和密碼創建,

值是客戶端的所有操作的記錄和狀態,

當這對鍵值對隨着請求結束,會返回到客戶端的時候發送到本地(瀏覽器 ),

瀏覽器有一個存放一對對的鍵值對的容器,這個就是cookie,

當第二次再訪問的時候,就帶着上次訪問的結果(鍵值對)一起到服務端,服務器就知道上次的操作,直接從cookie里取就可以,

瀏覽器是持有cookie的,可以被禁用掉的,禁用掉后那再次訪問服務端,服務端就不知道是誰訪問的,就只能直接登錄了,

 

在url 路由分發之前,會執行中間件函數,出去的時候還要走一次中間件,

 

在views 文件,login是登錄頁面,index_cookie 是登錄后才能看到的頁面

def login(request):

    # print("request_cookies",request.COOKIES)
   # request_cookies    {}  ,得到一個空字典,是第一次訪問的
    #自己設置一個cookie,在驗證成功后,跳轉之前,就要
    #設置cookie

    if request.method=="POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")

        if user == "gu" and pwd =="123":

        #設置session,       
        request.session["is_login"]=True
        request.session["username"]=user
#obj 就是要跳轉的下個頁面, obj = redirect("/index_cookie/") # 驗證成功,給客戶端obj,set一個cookie, obj.set_cookie("yuan", "123") #如果登錄成功,就顯示index——cookie頁面 return obj #用戶名和密碼不對,還是登錄頁面, return render(request,"login.html") def index_cookie(request): #要判斷用戶如果沒有登錄,就不能看到index——cookie頁面, #在login頁面用戶登錄成功后,服務端給了一個cookie,obj.set_cookie("yuan", "123") #所以就可以根據cookie來判斷,能否登錄 # print("cookies":request.COOKIES) #None是yuan的默認值, #is_login=request.COOKIES.get("yuan",None)
  
if is_login:#判斷是否有cookie return render(request,"index_cookie.html") #如果有cookie,就可看到index_cookie 頁面, else: return redirect("/login/")#否則,還是登錄頁面, return render(request,"index_cookie.html")
   
  #從session里判斷是否可以登錄
  is_login=request.session.get("is_login",False)

   if is_login:
     return render(request,"index_cookie.html")
   else: return redirect("/login/")
     return render(request,"index_cookie.html")

 

客戶端再登錄的時候,就可以直接登錄inde_cookie 頁面,如果是換了瀏覽器,inde_cookie 頁面就不會顯示,因為這個瀏覽器沒有上次登錄的cookie,

 

cookie放在客戶端的磁盤的某個位置,可能 被別人拿走不安全,不能把所有的信息都放在cookie里,

所以就有了cookie  +  session,把cookie信息就放在服務端,就是session,

原理:

  客戶端會有很多信息,登錄狀態,操作記錄等,組裝成cookie的一組組的鍵值對,這些信息會在服務端開辟出一塊空間來存放,在django會存到數據庫session表中,或者存到緩存中,或者內存中,或者文件中,通過配置文件可以設置,

  session就是與cookie來對應的,

  cookie 是 隨機字符串(key),如:abcd:{"is_login":true,username:"gu"},是服務端存儲的,abcd就是cookie,下次訪問帶着abcd訪問,服務端就會進行匹配,是否吻合{"is_login":true,username:"gu"},  

  session就保存在服務端的,就是cookie里的值,也就是狀態信息,{"is_login":true,username:"gu"}

舉例:

當一個客戶端登錄成功后,服務端隨機給客戶端生成一個字符串,cookie這時就有一個身份證號id,現在這個id還沒有意義,那么在服務端就會用一個字典把這個字符串以字典key的方式存起來,把登錄的狀態等信息,以value的方式存起來,最后在服務端用一塊空間把這個大字典存起來,如:abcd:{"is_login":true,username:"gu"},

下次再來訪問的時候,把abcd給服務端,服務端找到abcd這個id,然后進行值的匹配,吻合,就直接登錄頁面,

所以cookie只有key,存在客戶端,如 cookie:{"sessionid":"aaaa"}

session包含的狀態信息存在服務端,如: session:{:"aaaa":{"is_login":"Ture","username":"gu"....}}

======

從上面的列子可以簡寫,django里有張用戶表,是創建表的時候,django會自動生成的,

 

 

 

  

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM