cookie机制html
在程序中,会话跟踪是很重要的事情。理论上,一个用户的全部请求操做都应该属于同一个会话,而另外一个用户的全部请求操做则应该属于另外一个会话,两者不能混淆. 而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的链接就会关闭,再次交换数据须要创建新的链接。这就意味着服务器没法从链接上跟踪会话。要跟踪该会话,必须引入一种机制。jquery
Cookie就是这样的一种机制。它能够弥补HTTP协议无状态的不足。在Session出现以前,基本上全部的网站都采用Cookie来跟踪会话。数据库
Cookie其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还能够根据须要修改Cookie的内容。django
浏览器下的cookie:浏览器
request.COOKIES['key'] #表明客户端发送的所有cookie,以键值对方式存储,能够理解为一个字典 request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) #参数: default: 默认值 salt: 加密盐 max_age: 后台控制过时时间 request.COOKIES['key'] #key存在则获取,不存在则报错,不建议使用 request.COOKIES.get('key') #获取cookie,不存在返回None,建议使用
#建立响应对象 response=render(request,'index.html') response=redirect('index') #设置cookie response.set_cookie('key',value) #默认关闭浏览器就失效 response.set_signed_cookie(key,value,salt='加密盐',...) #设置带签名的cookie 其余参数: key, 键 value='', 值 max_age=None, cookie失效时间,单位秒 expires=None, cookie失效时间戳(IE requires expires, so set it if hasn't been already.),参数datetime对象 path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie能够被任何url的页面访问 domain=None, Cookie生效的域名 secure=False, https传输 httponly=False 只能http协议传输,没法被JavaScript获取(不是绝对,底层抓包能够获取到也能够被覆盖
带签名的cookie:设置时候加签,cookie内容是加密的缓存
因为cookie保存在客户端的电脑上,因此,JavaScript和jquery也能够操做cookie。安全
<script src='/static/js/jquery.cookie.js'> </script> $.cookie("key", value,{ path: '/' });
response.delete_cookie("cookie_key",path="/",domain=name)
cookie存储到客户端服务器
优势:cookie
数据存在在客户端,减轻服务器端的压力,提升网站的性能。session
缺点:
安全性不高:在客户端机很容易被查看或破解用户会话信息
由于因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的、独立的。通俗地说,就是没法保存用户状态,后台服务器根本就不知道当前请求和之前及之后请求是否来自同一用户。
为了实现链接状态的保持功能,网站会经过用户的浏览器在用户机器内被限定的硬盘位置中写入一些数据,也就是所谓的Cookie。经过Cookie能够保存一些诸如用户名、浏览记录、表单记录、登陆和注销等各类数据。可是这种方式很是不安全,由于Cookie保存在用户的机器上,若是Cookie被伪造、篡改或删除,就会形成极大的安全威胁,所以,现代网站设计一般将Cookie用来保存一些不重要的内容,实际的用户数据和状态仍是以Session会话的方式保存在服务器端。
Session依赖Cookie!但与Cookie不一样的地方在于Session将全部的数据都放在服务器端,用户浏览器的Cookie中只会保存一个非明文的识别信息,好比哈希值。
Django提供了一个通用的Session框架,而且可使用多种session数据的保存方式:
保存在数据库内
保存到缓存
保存到文件内
保存到cookie内
一般状况,没有特别需求的话,请使用保存在数据库内的方式,尽可能不要保存到Cookie内。
Django的session框架默认启用,并已经注册在app设置内,若是真的没有启用,那么参考下面的内容添加有说明的那两行,再执行migrate命令建立数据表,就可使用session了。
当session启用后,传递给视图request参数的HttpRequest对象将包含一个session属性,就像一个字典对象同样。你能够在Django的任何地方读写request.session属性,或者屡次编辑使用它。
1、设置Sessions值 request.session['session_name'] ="admin" 2、获取Sessions值 session_name = request.session["session_name"] 3、删除Sessions值 del request.session["session_name"] 4、检测是否操做session值 if "session_name" is request.session :
五、get(key, default=None) fav_color = request.session.get('fav_color', 'red') 6、pop(key) fav_color = request.session.pop('fav_color') 7、keys() 8、items() 9、setdefault() 10、flush() 删除当前的会话数据并删除会话的Cookie。 这用于确保前面的会话数据不能够再次被用户的浏览器访问 例如,django.contrib.auth.logout() 函数中就会调用它。 11 用户session的随机字符串 request.session.session_key # 将全部Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否 request.session.exists("session_key") # 删除当前用户的全部Session数据 request.session.delete("session_key") request.session.set_expiry(value) * 若是value是个整数,session会在些秒数后失效。 * 若是value是个datatime或timedelta,session就会在这个时间后失效。 * 若是value是0,用户关闭浏览器session就会失效。 * 若是value是None,session会依赖全局session失效策略。
def log_in(request): if request.method=="POST": username=request.POST['user'] password=request.POST['pwd'] user=UserInfo.objects.filter(username=username,password=password) if user: #设置session内部的字典内容 request.session['is_login']='true' request.session['username']=username #登陆成功就将url重定向到后台的url return redirect('/backend/') #登陆不成功或第一访问就停留在登陆页面 return render(request,'login.html') def backend(request): print(request.session,"------cookie") print(request.COOKIES,'-------session') """ 这里必须用读取字典的get()方法把is_login的value缺省设置为False, 当用户访问backend这个url先尝试获取这个浏览器对应的session中的 is_login的值。若是对方登陆成功的话,在login里就已经把is_login 的值修改成了True,反之这个值就是False的 """ is_login=request.session.get('is_login',False) #若是为真,就说明用户是正常登录的 if is_login: #获取字典的内容并传入页面文件 cookie_content=request.COOKIES session_content=request.session username=request.session['username'] return render(request,'backend.html',locals()) else: """ 若是访问的时候没有携带正确的session, 就直接被重定向url回login页面 """ return redirect('/login/') def log_out(request): """ 直接经过request.session['is_login']回去返回的时候, 若是is_login对应的value值不存在会致使程序异常。因此 须要作异常处理 """ try: #删除is_login对应的value值 del request.session['is_login'] # OR---->request.session.flush() # 删除django-session表中的对应一行记录 except KeyError: pass #点击注销以后,直接重定向回登陆页面 return redirect('/login/')
===================================login.html================== <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post"> <p>用户名: <input type="text" name="user"></p> <p>密码: <input type="password" name="pwd"></p> <p><input type="submit"></p> </form> </body> </html> ===================================backend.html================== <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>hello {{ username }}</h3> <a href="/logout/">注销</a> </body> </html>
1)数据库配置(默认)
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,默认修改以后才保存(默认)
2)缓存配置
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也能够是memcache),此处别名依赖缓存的设置 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,默认修改以后才保存
3)文件配置
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,若是为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 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,默认修改以后才保存
服务器是如何判断你已经登陆的呢。那就是用的cookie或者session功能。
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
同时咱们也看到,因为采用服务器端保持状态的方案在客户端也须要保存一个标识,因此session机制可能须要借助于cookie机制来达到保存标识的目的,但实际上它还有其余选择。
一、cookie数据存放在客户的浏览器上,session数据放在服务器上。
二、cookie不是很安全,别人能够分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
三、session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
四、单个cookie保存的数据不能超过4K,不少浏览器都限制一个站点最多保存20个cookie。
一、自动生成一段字符串
二、将字符串发送到客户端的浏览器,同时把字符串当作key放在session里。(能够理解为session就是一个字典)
三、在用户的session对应的value里设置任意值