cookie 和 session

Django之session和cookie

Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道。

  因为HTTP协议是无状态的,即每次用户请求到达服务器时,HTTP服务器并不知道这个用户是谁、是否登录过等。现在的服务器之所以知道我们是否已经登录,是因为服务器在登录时设置了浏览器的Cookie!Session则是借由Cookie而实现的更高层的服务器与浏览器之间的会话。

网页

概念

Cookie是由客户端保存的小型文本文件,其内容为一系列的键值对。 Cookie是由HTTP服务器设置的,保存在浏览器中, 在用户访问其他页面时,会在HTTP请求中附上该服务器之前设置的Cookie

原理:

cookie的原理:
第一次:浏览器向服务端发送第一次请求,服务端接收返回一个html页面
    
第二次:接着浏览器客户端进行登录注册,将用户名密码以post形式传给服务端-请求
这时服务端与数据库进行连接,数据库进行判断---
如果是正确的,渲染一个页面并设了一个cookie,此时cookie的val值是一个随机的字符串

if true: obj=redirect('/xxx/'),obj.set_cookie()
那服务端就给返回来一个cookie值,换句话讲的就是一张小纸条(cookie-key:value)
在客户端就页面访问cookie   可以看到的是一个键值对

第三次请求:客户端就带着一个cookie请求到服务端(进行其他的响应)也就是说那这个小纸条进行验证,如果没有小纸条,或者就是这个cookie过期了,以login为例,请重新进行登录,重新设定一下cookie。
在服务端登记的 (session内容),可以拿到客户端的隐私信息,也就是name值----

cookie 的value值:  value的隐私信息 【‘name' :'xxx','age':18】
cookie的val值 作为session的key值

传递流程

1.浏览器向某个URL发起HTTP请求(可以是任何请求,比如GET一个页面、POST一个登录表单等)
2.对应的服务器收到该HTTP请求,并计算应当返回给浏览器的HTTP响应。
3.在响应头加入set-cookie字段,它的值是要设置的Cookie。
UserAgent(浏览器就是一种用户代理)至少应支持300项Cookie, 每项至少应支持到4096字节,每个域名至少支持20项Cookie
4.浏览器收到来自服务器的HTTP响应。
5浏览器在响应头中发现set-cookie字段,就会将该字段的值保存在内存或者硬盘中。
set-cookie字段的值可以是很多项Cookie,每一项都可以指定过期时间Expires。 默认的过期时间是用户关闭浏览器时。
6.浏览器下次给该服务器发送HTTP请求时, 会将服务器设置的Cookie附加在HTTP请求的头字段Cookie中。
浏览器可以存储多个域名下的Cookie,但只发送当前请求的域名曾经指定的Cookie, 这个域名也可以在set-cookie字段中指定。
7.服务器收到这个HTTP请求,发现请求头中有Cookie字段, 便知道之前就和这个用户打过交道了。
8.过期的Cookie会被浏览器删除。
  服务器通过set-cookie响应头字段来指示浏览器保存Cookie, 浏览器通过Cookie请求头字段来告诉服务器之前的状态。 Cookie中包含若干个键值对,每个键值对可以设置过期时间。 

作用

HTTP协议是无状态的,每次请求都是无关联的,没有办法保存状态,所以使用Cookie保存状态。

特性

服务器让浏览器保存的Cookie。
浏览器有权拒绝保存Cookie,但是当浏览器拒绝保存Cookie时,就无法完成Web登录。

缺点

Cookie长度有限,能保存的数据量有限。Cookie保存在本地,导致数据不安全。

使用

由于Cookie以字典的形式保存,所以使用操作字典的方式来操作Cookie。

设置Cookie

  普通设置,key为键,value为值,max_age为后台控制过期时间。

ret = HttpResponse('xxoo')
ret.set_cookie(key, value, max_age=5)

设置加密Cookie

  salt为设置加密用的盐。

ret = HttpResponse('xxoo')
ret.set_signed_cookie(key, max_age=5, salt='xxoo')

  Cookie可以设置多个参数,具体参数关键字如下:

key
value=''
max_age=None 超时时间
ecpires=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获取(不是绝对,底层抓包可以获取到,也可以被覆盖)

获取cookie

获取普通方式设置的Cookie

方法一:request.COOKIES['is_login']
方法二:request.COOKIES.get('is_login')

 获取加盐设置的Cookie

request.get_signed_cookie(key, salt='xxoo', default='') 其默认值为default

​ 删除cookie

ret.delete_cookie(key)  # key 为之前设置的键

Session

概念

  保存在服务器上的一组组键值对,与Cookie搭配使用。

作用

  Cookie保存在浏览器本地,容易非法获取,不安全;而session是保存在服务器上,数据安全。

  Cookie的长度受到限制,而session是经过加密换算得到的结果,不受长度限制。

设置session

login:
            ### 向客户端回写一个cookie值
            '''
                1. 向客户端回写一个 {sessionid : 'lr3gmj3vpt0ytf7locqnb21p0cg63iek'}
                2. 将客户的隐私信息保存在了服务端的数据库中, 也就是session保存在了数据库中
                    默认放在django_session表中
                    {"dsjnalndjskanjdksa" : {"name":'zekai', 'age':12, 'addr':'dsabdsa'}}
            '''
            #### 设置session
            request.session['name'] = username
            request.session['age'] = 13
    
            #### 获取session
            request.session.get('name')
    
        ### 默认session存在数据库中, django_session表
posted @ 2019-08-19 20:49  enazede  阅读(182)  评论(0编辑  收藏  举报