• Django 学习之cookie与session


    .cookiesession的介绍

    cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。

    cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。

    cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session

    问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。

    我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookieid,在服务器上保存一段时间的私密资料,如“账号密码”等等。

    总结而言:cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本。

    另外,上述所说的cookiesession其实是共通性的东西,不限于语言和框架

    .Cookie概述

    1.什么叫Cookie

    Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookiekey-value结构,类似于一个python中的字典。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!

    2.Cookie的原理

    cookie的工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,浏览器收到相应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

    2.查看Cookie

        我们使用Chrome浏览器,打开开发者工具。 

    3.cookie图解

    4.Cookie规范

    Cookie大小上限为4KB

     一个服务器最多在客户端浏览器上保存20Cookie

     一个浏览器最多保存300Cookie,因为一个浏览器可以访问多个服务器。

        上面的数据只是HTTPCookie规范,但在浏览器大战的今天,一些浏览器为了打败对手,为了展现自己的能力起见,可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500Cookie等!但也不会出现把你硬盘占满的可能!

    注意,不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你在使用FireFox访问服务器时,不可能把IE保存的Cookie发送给服务器。

    5.CookieHTTP 

    Cookie是通过HTTP请求和响应头在客户端和服务器端传递的:

    Cookie:请求头,客户端发送给服务器端;

    格式:Cookie: a=A; b=B; c=C。即多个Cookie用分号离开; l Set-Cookie:响应头,服务器端发送给客户端;

    一个Cookie对象一个Set-CookieSet-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C  

    6.Cookie的覆盖

    如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA

    .Djangocookie的简单使用

    Ctrl + Shift + del三个键来清除页面缓存和cookie,将来这个操作你会用的很多。

    1.获取Cookie

    request.COOKIES.get("islogin",None)  #如果有就获取,没有就默认为none

    request.COOKIES['key']

    request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

    参数:

    default: 默认值

    salt: 加密盐

    max_age: 后台控制过期时间

    2.设置Cookie

      obj = redirect("/index/")

      obj.set_cookie("islogin",True)  #设置cookie值,注意这里的参数,一个是键,一个是值

      obj.set_cookie("haiyan","344",20)  #20代表过期时间

      obj.set_cookie("username", username)

    例子2

    rep = HttpResponse(...)

    rep render(request, ...)

    rep.set_cookie(key,value,...)

    rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)

    参数:

    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获取(不是绝对,底层抓包可以获取到也可以被覆盖)

    3.删除Cookie

    obj.delete_cookie("cookie_key",path="/",domain=name)   

    def logout(request):

        rep = redirect("/login/")

        rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie

        return rep

    登录认证示例:

    需要知道几点

    一共有三次请求

      注意:form表单的action走的路径还是/login/

         第一次请求:url:http://127.0.0.1:8080/login get请求

           第一次请求:url:http://127.0.0.1:8080/login post请求 user pasw

           第一次请求:url:http://127.0.0.1:8080/index post请求 携带着cookie的了

           所以在index页面中就会取到cookie,因为这是的index里面已经有cookie

     

    cookie存储到客户端

    优点:数据存储在客户端。减轻服务端的压力,提高网站的性能

    缺点:安全性不高,在客户端很容易被查看或破解用户会话信息

    4.用户注销删除cookie页面访问案例

    例:

    urls.py

    from cookie import views

    urlpatterns = [

        path('admin/', admin.site.urls),

        path('login/', views.login),

        path('index/', views.index),

        path('logout/', views.logout),

        path('order/', views.order),

    ]

    views.py

    from django.shortcuts import render, HttpResponse, redirect

    from cookie import models

    def login(request):

        if request.method == "GET":

            return render(request, "login.html")

        username = request.POST.get("username")

        password = request.POST.get("pwd")

        user_obj = models.Userinfo.objects.filter(username=username, password=password).first()

        if not user_obj:

            return redirect("/login/")

        else:

            rep = redirect("/index/")

            rep.set_cookie("is_login", True)

            # rep.set_cookie("username",user_obj.name)

            return rep

     

     

    def index(request):

        status = request.COOKIES.get("is_login")  # cookie的提交数据

        if not status:

            return redirect('/login/')

        return render(request, "index.html")

     

    # 同理index页面的限制

    def order(request):

        status = request.COOKIES.get("is_login")  # cookie的提交数据

        if not status:

            return redirect('/login/')

        return render(request, "order.html")

     

     

    def logout(request):

        rep = redirect('/login/')

        # 注销后删除cookie,访问index将访问不了,这样可以限制没有登录的用户对index页面的访问

        rep.delete_cookie("is_login")

        return rep

     

    前端三个页面的内容为:

    login.html

    <body>

    <h3>用户登录</h3>

    <form action="" method="post">

    {% csrf_token %}

        <p>用户名:<input type="text" name="username"></p>

        <p>密码  :<input type="password" name="pwd"></p>

        <input type="submit">

    </form>

    </body>

     

    index.html

    <body>

    <p>index 页面。。。。</p>

    <a href="/logout/">注销</a>

    </body>

    order.html

    <body>

    <p>order 页面。。。。</p>

    <a href="/logout/">注销</a>

    </body>

     

    .Django session的简单使用

    1.Session介绍

    Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。

    2.Session图解

    3.为什么需要Session

    Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session

      问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。

      我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookieid,在服务器上保存一段时间的私密资料,如“账号密码”等等。

      总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。

      另外,上述所说的CookieSession其实是共通性的东西,不限于语言和框架。

    4.基本操作

    (1)设置session

        request.session["session_name"]="admin"

    (2)获取session

        session_name = request.session("session_name")

    (3)删除session

        del request.session["session_name"]  删除一组键值对

        request.session.flush()   删除一条记录

    (4)检测是否操作session

        if "session_name"  is request.session:

    其他操作

    (5)get(key, default=None)

    fav_color = request.session.get('fav_color', 'red')

    (6)pop(key)

    fav_color = request.session.pop('fav_color')

    (7)keys()

    (8)items()

    (9)setdefault()

    (10)flush() 删除当前的会话数据并删除会话的Cookie

                这用于确保前面的会话数据不可以再次被用户的浏览器访问

                例如,django.contrib.auth.logout() 函数中就会调用它。

    (11)用户session的随机字符串

            request.session.session_key

      

            # 将所有Session失效日期小于当前日期的数据删除

            request.session.clear_expired()

      

            # 检查 用户session的随机字符串 在数据库中是否

            request.session.exists("session_key")

      

            # 删除当前用户的所有Session数据

            request.session.delete("session_key")

      

            request.session.set_expiry(value)

                * 如果value是个整数,session会在些秒数后失效。

                * 如果value是个datatimetimedeltasession就会在这个时间后失效。

                * 如果value0,用户关闭浏览器session就会失效。

                * 如果valueNone,session会依赖全局session失效策略。

    5.session配置

    a. 配置 settings.py

        SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)       

    SESSION_COOKIE_NAME "sessionid"                       

    # Sessioncookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)

    SESSION_COOKIE_PATH "/"                               

    # Sessioncookie保存的路径(默认)

    SESSION_COOKIE_DOMAIN = None                             

    # Sessioncookie保存的域名(默认)

    SESSION_COOKIE_SECURE = False                            

    # 是否Https传输cookie(默认)

    SESSION_COOKIE_HTTPONLY = True                          

     # 是否Sessioncookie只支持http传输(默认)

    SESSION_COOKIE_AGE = 1209600                             

    # Sessioncookie失效日期(2周)(默认)

    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  

    # 是否关闭浏览器使得Session过期(默认)

    SESSION_SAVE_EVERY_REQUEST = False                       

    # 是否每次请求都保存Session,默认修改之后才保存(默认)

    6.session案例

    urls.py

    from session import views as session_views

    urlpatterns = [

        path('admin/', admin.site.urls),

        path('session_login/', session_views.login),

        path('s_index/', session_views.s_index),

        path('s_logout/', session_views.s_logout),

    ]

    views.py

    from django.shortcuts import render, HttpResponse, redirect

    from session import models

    # Create your views here.

    def login(request):

        if request.method == "GET":

            return render(request, "login.html")

        username = request.POST.get("username")

        password = request.POST.get("pwd")

        user_obj = models.Userinfo.objects.filter(username=username, password=password).first()

        if not user_obj:

            return redirect("/login/")

        else:

            rep = redirect("/index/")

            rep.set_cookie("is_login", True)

            # rep.set_cookie("username",user_obj.name)

            return rep

    def index(request):

        status = request.COOKIES.get("is_login")  # cookie的提交数据

        if not status:

            return redirect('/login/')

        return render(request, "index.html")

    # 同理index页面的限制

    def order(request):

        status = request.COOKIES.get("is_login")  # cookie的提交数据

        if not status:

            return redirect('/login/')

        return render(request, "order.html")

    def logout(request):

        rep = redirect('/login/')

        # 注销后删除cookie,访问index将访问不了,这样可以限制没有登录的用户对index页面的访问

        rep.delete_cookie("is_login")

        return rep

    s_index.html

    <body>

    <p>session index 页面。。。。</p>

    <a href="/s_logout/">注销</a>

    </body>

    </body>

    关于session存在和消失的时候:

  • 相关阅读:
    linux 命令——48 watch (转)
    linux 命令——47 iostat (转)
    linux 命令——46 vmstat(转)
    linux 命令——45 free(转)
    linux 命令——44 top (转)
    linux 命令——43 killall(转)
    linux 命令——42 kill (转)
    linux 命令——41 ps(转)
    linux 命令——40 wc (转)
    Java for LeetCode 068 Text Justification
  • 原文地址:https://www.cnblogs.com/hszstudypy/p/11178739.html
Copyright © 2020-2023  润新知