Django——会话跟踪
1.引言
1.1什么是会话
会话是指一个终端用户(服务器)与交互系统(客户端)进行通讯的过程。
1.2什么是会话跟踪
对同一个用户对服务器的连续的请求和接受响应的监视。(将用户与同一用户发出的不同请求之间关联,为了数据共享)
1.3会话跟踪是干什么的
浏览器与服务器之间的通信是通过HTTP协议进行通信的,因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的、独立的。通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户。对于静态网站,这可能不是个问题,而对于动态网站,尤其是京东、天猫、银行等购物或金融网站,无法识别用户并保持用户状态是致命的,根本就无法提供服务。而会话跟踪正是为了解决这一问题的。
-
Cookie
Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。
客户端可以采用两种方式来保存这个Cookie对象,一种方式是保存在客户端内存中,称为临时Cookie,浏览器关闭后 这个Cookie对象将消失。另外一种方式是保存在 客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是 这个Cookie在有效期内。这样就实现了对客户的跟踪。
Cookie是可以被禁止的。
-
session
每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户。Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效。因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。此时可以考虑URL重写和表单隐藏域。
-
URL重写
URL(统一资源定位符)是Web上特定页面的地址,URL重写的技术就是在URL结尾添加一个附加数据以标识该会话,把会话ID通过URL的信息传递过去,以便在服务器端进行识别不同的用户 。
-
隐藏表单域
将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示 。
2.Django的Cookie
2.1概述
Cookie是key-value结构,类似于一个python中的字典。
随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!
注意,不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你在使用Google访问服务器时,不可能把IE保存的Cookie发送给服务器
2.1.1Cookie与HTTP头
Cookie是通过HTTP请求和响应头在客户端和服务器端传递的:
- Cookie:请求头,客户端发送给服务器端;
- 格式:Cookie: a=A; b=B; c=C。即多个Cookie用分号离开; Set-Cookie:响应头,服务器端发送给客户端;
- 一个Cookie对象一个Set-Cookie: Set-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C
2.1.2 Cookie的覆盖
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。
2.2 Cookie语法
2.2.1 设置Cookie
rep = HttpResponse(...) / render(...) # 要返回给客户端的Response对象 rep.set_cookie(key,value...) # 给要返回的对象设置Cookie rep.set_signed_cookie(key,value,salt='加密盐') # 设置加密Cookie
设置Cookie的相关参数:
from django.http import HttpResponse # HttpResponse中没有定义set_cookie class HttpResponse(HttpResponseBase): # set_cookie定义在HttpResponseBase中 class HttpResponseBase: # ... def set_cookie(self, key, # 键 value='', # 值 max_age=None, # 超长时间 # cookie需要延续的时间(以秒为单位) # 如果参数是:None,这个cookie会延续到浏览器关闭为止。 expires=None, # 超长时间 # expires默认None,cookie失效的实际日期/时间 path='/', # Cookie生效的路径 # 浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他应用。 domain=None, # Cookie生效的域名 # 可以用这个参数来构造一个跨站cookie。 # 如, domain=".example.com"所构造的cookie对下面这些站点都是可读的: # www.example.com 、 www2.example.com和an.other.sub.domain.example.com 。 # 如果该参数设置为 None ,cookie只能由设置它的站点读取。 secure=False, # 如果设置为 True ,浏览器将通过HTTPS来回传cookie。 httponly=False, # 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖) samesite=None, # 用来防止CSRF攻击和用户追踪,有Strict,Lax,None,防御强度依次降低
2.2.2 获取Cookie
request.COOKIES.get('key') request.get_signed_cookie('key',salt='加密盐',default='') # 获取加密cookie
2.2.3 删除Cookie
def logout(request): rep = redirect("/login/") rep.delete_cookie("cookie_key") # 删除用户浏览器上之前设置的usercookie值 return rep
3.Django的session
3.1概述
Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。
3.2 session语法
1、设置session值: request.session['session_name'] = 'value' 2、获取session值: request.session.get('session_name','') 3、删除session值: del request.session['session_name'] 4、flush() 删除当前的会话数据并删除会话的Cookie。 这用于确保前面的会话数据不可以再次被用户的浏览器访问 5、存在则不设置 request.session.setdefault('session_name','value') 6、所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() 7、用户session的随机字符串 request.session.session_key 8、将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() 9、 检查 用户session的随机字符串 在数据库中是否 request.session.exists("session_key") 10、删除当前用户的所有Session数据 request.session.delete("session_key") 11、request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
3.2 session配置
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。 a. 配置 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,默认修改之后才保存(默认)
4.session与Cookie区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
应用场景:
记住账号密码一般在cookie中,购物车的实现一般也是cookie。
私人信息及登陆验证信息在session中。