zoukankan      html  css  js  c++  java
  • 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会自动生成的,

      

      

  • 相关阅读:
    《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》
    YOLO(v1)
    循环赛日程表问题(分治法)
    平面最接近点对问题(分治法)
    SQLite学习心得
    如何找到Linux下常用命令的源码
    WiFi安全之WPA介绍
    七种不良的工作习惯
    Git 技巧小结
    微信智能硬件平台 简介
  • 原文地址:https://www.cnblogs.com/gyh04541/p/7966528.html
Copyright © 2011-2022 走看看