zoukankan      html  css  js  c++  java
  • Django组件--cookie与session

    一、会话跟踪技术

    1、什么是会话跟踪技术

    我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器了。从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束。在通话过程中,你会向10086发出多个请求,那么这多个请求都在一个会话中。 
    在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束。 

    在一个会话的多个请求中共享数据,这就是会话跟踪技术。例如在一个会话中的请求如下: 

    • 请求银行主页; 
    • 请求登录(请求参数是用户名和密码);
    • 请求转账(请求参数与转账相关的数据); 
    • 请求信誉卡还款(请求参数与还款相关的数据)。  

    在这上会话中当前用户信息必须在这个会话中共享的,因为登录的是张三,那么在转账和还款时一定是相对张三的转账和还款!这就说明我们必须在一个会话过程中有共享数据的能力。

    2、会话跟踪技术使用cookie或session完成

    我们知道HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪!在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术。 

    什么叫Cookie ?

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

    Cookie规范 

    •  Cookie大小上限为4KB; 
    •  一个服务器最多在客户端浏览器上保存20个Cookie; 
    •  一个浏览器最多保存300个Cookie;  

    上面的数据只是HTTP的Cookie规范,但在浏览器大战的今天,一些浏览器为了打败对手,为了展现自己的能力起见,可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500个Cookie等!但也不会出现把你硬盘占满的可能! 
    注意,不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你在使用FireFox访问服务器时,不可能把IE保存的Cookie发送给服务器。

    Cookie的覆盖 

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

    django中的cookie语法

    设置cookie:

    1
    2
    3
    4
    rep = HttpResponse(...)
    或 rep = render(request, ...)
    或 rep = redirect()
      
    rep.set_cookie(key,value,...)
    rep.set_signed_cookie(key,value,salt='加密盐',...) 

    例如:

    obj=redirect("/index/")
    
    # 设置cookie
    obj.set_cookie("username",user)
    obj.set_cookie("is_login",True,max_age=3600*24*7) #max_age=3600*24*7为cookie需要延续的时间,以秒为单位
    return obj

    获取cookie:

    1
    request.COOKIES.get('key')  

    删除cookie:

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

    session

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

    django中session语法

    用户认证信息存储语法:

    request.session['username'] = user
    request.session['is_login'] = True
    上面这两句语法其实相当于做了以下几件事:
    
               if request.COOKIES.get("sessionid"):
                   random_str=request.COOKIE.get("sessionid")
                   在django_seesion表中过滤session_key=random_str的记录将session_data进行update,session_key保持不变
                    
               else:
                                
                   1 生成一个随机字符串   23423hkjsf890234sd
                   2 向django_session表中插入记录
                       session-key         session-data
                      23423hkjsf890234sd   {"susername":"egon","slogin":True}
                
                   3 响应set_cookie :   {"sessionid":23423hkjsf890234sd}
    
    以上说明了一个浏览器客户端在服务器的django_session中只会保留一条用户认证信息记录,当有新的用户用此浏览器登陆时,会对之前的session_data里面的信息进行更改.


    获取用户认证信息语法:

    request.session.get('username')
    request.session.get('is_login')
    上面这两句语法相当于做了以下几件事:
           1 request.COOKIE.get("sessionid")   :23423hkjsf890234sd
           2 在django-session表过滤session-key=23423hkjsf890234sd的记录
           3 取过滤记录的session-data反序列化成数据字典:{"susername":"egon","slogin":True}

    删除Sessions值

    del request.session["username"]

    用户退出:

    request.session.flush()
    上面这条语法相当于做了以下几件事:
    1 request.COOKIE.get("sessionid")   :23423hkjsf890234sd
    2 在django-session表过滤session-key=23423hkjsf890234sd的记录删除
    3 response.delete_cookie("sessionid")

     总结:Cookie技术是将服务器设置的键值结构数据保存在浏览器端,存储数据大小有限,并且不安全,容易造成信息泄露;Session技术基于Cookie技术实现,不同的是session会将设置的键值结构数据存储在服务器端,数据安全,但其缺点是当存储的数据量很大时,容易造成服务器压力。

  • 相关阅读:
    Encryption (hard) CodeForces
    cf 1163D Mysterious Code (字符串, dp)
    AC日记——大整数的因子 openjudge 1.6 13
    AC日记——计算2的N次方 openjudge 1.6 12
    Ac日记——大整数减法 openjudge 1.6 11
    AC日记——大整数加法 openjudge 1.6 10
    AC日记——组合数问题 落谷 P2822 noip2016day2T1
    AC日记——向量点积计算 openjudge 1.6 09
    AC日记——石头剪刀布 openjudge 1.6 08
    AC日记——有趣的跳跃 openjudge 1.6 07
  • 原文地址:https://www.cnblogs.com/fengchong/p/9909458.html
Copyright © 2011-2022 走看看