Session

cookie是保存在用户浏览器上的键值对
session是保存在服务器端的键值对(依赖cookie)
 
一、基本原理
 
1、Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
-数据库(默认)
-缓存
-文件
-缓存+数据库
-加密cookie
 
2、基本原理
#生成随机的字符串
#发给用户,写到用户浏览器的cookie中
#自己保留一份,默认保存在数据库中,保存了一份相对应的数据 "随机的字符串","用户的信息"
#每次请求时,拿着用户发来的数据去数据库中比对
当用户访问到一个服务器,如果服务器启用Session,服务器就要为该用户创建一个SESSION,在创建这个SESSION的时候,服务器首先检查这个用户发来的请求里是否包含了一个SESSION ID,如果包含了一个SESSION ID则说明之前该用户已经登陆过并为此用户创建过SESSION,那服务器就按照这个SESSION ID把这个SESSION在服务器的内存中查找出来(如果查找不到,就有可能为他新创建一个),如果客户端请求里不包含有SESSION ID,则为该客户端创建一个SESSION并生成一个与此SESSION相关的SESSION ID。这个SESSION ID是唯一的、不重复的、不容易找到规律的字符串,这个SESSION ID将被在本次响应中返回到客户端保存,而保存这个SESSION ID的正是COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。 
 
3、相关的参数,可以在setting中设置
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
 
配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
     
    SESSION_COOKIE_NAME = "sessionid"          # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                     # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                   # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                     # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                  # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                      # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False       # 是否关闭浏览器使得Session过期(默认)
    
    SESSION_SAVE_EVERY_REQUEST = False      # 是否每次请求都保存Session,默认修改之后才保存(默认)
   #False时,失效时间一到,就会立刻失效,True时,每次访问都会保存session,直到不再访问+到失效时间时才失效
 
二、使用
 
a、创建保存session的表
python manage.py makemigrations   
python manage.py migrate
 
b、在session中设置数据
request.session["xx1"]="x1"   登陆成功时设置
request.session["xx2"]="x2"
request.session["xx3"]="x3"
request.session.setdefault("k1",123)   不存在则设置
 
c、读取
request.session.get("xx1")  没有会取到None
 
d、删除
del request.session['xx1']    删除session的某条信息
request.session.delete()      删除整个session  (退出时用)
 
e、其他的一些方法
request.session.session_key           # 用户session的随机字符串
request.session.clear_expired()       # 将所有Session失效日期小于当前日期的数据删除
request.session.exist("session_key")     # 检查 用户session的随机字符串 在数据库中是否存在
 
request.session.set_expiry(value)
            * 如果value是个整数,session会在些秒数后失效。
            * 如果value是个datatime或timedelta,session就会在这个时间后失效。
            * 如果value是0,用户关闭浏览器session就会失效。
            * 如果value是None,session会依赖全局session失效策略。
 
二、Cookie和Session的区别
1、存放位置不同
Cookie保存在客户端,Session保存在服务端。
 
2 、存取方式的不同
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。
而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。
 
3、安全性(隐私策略)的不同
Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。
 
4、有效期上的不同
只需要设置Cookie的过期时间属性为一个很大很大的数字,Cookie就可以在浏览器保存很长时间。 由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。
 
5、对服务器造成的压力不同
Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。
 
6、 跨域支持上的不同
Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效

 


 
 
 
 
 
 
 
 
 
 
 
posted @ 2017-12-10 23:15  唐宋元明卿  阅读(134)  评论(0编辑  收藏  举报