Session和Cookie
学习网址:http://blog.tommyyang.cn/2017/03/15/Session%E8%AF%A6%E8%A7%A3/
Cookie
Cookie指某些网站为了辨别用户身份、在用户本地终端上存储的数据(通常经过加密).
Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),
浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,
服务器可以知道该用户是否合法用户以及是否需要重新登录等。
服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。
另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。
Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用。
Cookie以键值对的格式进行信息的存储。
Cookie基于域名安全,不同域名的Cookie是不能互相访问的,如访问itcast.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息。
当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器。
设置COOKIE(服务端设置cookie)
HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
- max_age 以秒为单位,cookie过期时间.
- expires 应该是一个UTC "Wdy, DD-Mon-YY HH:MM:SS GMT" 格式的字符串,或者一个datetime.datetime对象。
- 如果你想设置一个跨域的Cookie,请使用domain 参数。例如,domain=".lawrence.com" 将设置一个www.lawrence.com、blogs.lawrence.com 和calendars.lawrence.com 都可读的Cookie。否则,Cookie 将只能被设置它的域读取。
- 如果你想阻止客服端的JavaScript 访问Cookie,可以设置httponly=True。
注意: 客户端至少应该支持4096个字节的Cookie。对于许多浏览器,这也是最大的大小。如果视图存储大于4096个字节的Cookie,Django不会引发异常,但是浏览器将不能正确设置Cookie。
Cookie分为会话Cookie和持久Cookie,如果max_age设置了Cookie的过期时间就是持久Cookie,Cookie存储在硬盘的某个文件当中,即便用户关闭了浏览器,只要不到设置的过期时间,下次打开浏览器Cookie依然存在。
会话Cookie不设置max_age(到期时间),默认浏览器关闭,Cookie删除。这种Cookie信息一般存储在内存当中。
删除COOKIE(服务端删除cookie)
HttpResponse.delete_cookie(key, path='/', domain=None) 删除指定的key 的Cookie。如果key 不存在则什么也不发生。 由于Cookie 的工作方式,path 和domain 应该与set_cookie()中使用的值相同,否则Cookie 不会删掉。
读取和修改COOKIE(客户端)
HttpRequest.COOKIES, 一个标准的Python 字典,包含所有的cookie。键和值都为字符串.
request.COOKIES.get(key, '')
request.COOKIES[key]
Session
对于敏感、重要的信息,建议要储在服务器端,不能存储在浏览器中,如密码、余额、等级、验证码等信息. 在服务器端进行状态保持的方案就是Session.
Session依赖于Cookie:
所有请求者的Session都会存储在服务器中,服务器如何区分请求者和Session数据的对应关系?在使用Session后,会在Cookie中存储一个sessionid的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到sessionid后,会根据这个值找出这个请求者的Session.
如果想使用Session,浏览器必须支持Cookie,否则就无法使用Session了. 存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置(默认两周).
存储方式
我们通过设置SESSION_ENGINE项指定Session数据存储的方式,可以存储在数据库、缓存、Redis, 文件,纯Cookie, Memcached等.
- 存储在数据库中, 这是默认存储方式 .
SESSION_ENGINE='django.contrib.sessions.backends.db'
- 存储在缓存,存储本机内存中,如果丢失则不能找回,比数据库的方式读写更快.
SESSION_ENGINE='django.contrib.sessions.backends.cache'
- 混合存储:优先从本机内存中存取,如果没有则从数据库中存取.
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'