一.介绍
1.用途:
如果直接输入后台的URL也可以访问,这显然不合理
这里缺失的就是COOKIE和SESSION配合的验证
2.工作机制:
1.COOKIE不属于HTTP协议的范围:HTTP协议无状态,故引入COOKIE,起桥接作用
2.COOKIE的工作原理:由Server产生内容,Browser收到请求后以文本形式保存在本地
Browser再次访问时,会自动带上COOKIE,Server通过COOKIE的内容来判断状态
3.由于COOKIE最大支持4096B,以及COOKIE保存在Client,可能被拦截或窃取
因此需要1种新机制,需要支持更多字节,并保存在Server,有较高安全性,这就是SESSION
通过COOKIE识别不同用户,对应的在SESSION里保存私密信息及超过4096B的文本
4.每次使用浏览器访问登陆页面时,一旦通过认证,Server会返回一组随机唯一的String(如123abc),这就是Cookie
而Server也会存储用户当前的状态,如login=True,username=hahaha等用户信息到SESSION中
这种存储是字典形式的,字典唯一的key就是Cookie,即SessionID,值是用户状态信息构成的字典
如果在Server查看Session,会看到:{'123abc':{'login':true,'username:hahaha'}}
6.给每个Client的COOKIE分配1个唯一的ID,这样通过COOKIE,Server就知道是谁的请求
然后再根据不同COKCIE的ID,在Server上保存一段时间的私密资料,如账号密码
3.语法
(1)操作Cookie:
#获取Cookie值:
<request>.COOKIES["<key>"]
#设置Cookie值:
<response>.set_cookie("<cookie_key>","<cookie_value>",<key>=<value>)
#参数说明:
key:指定参数;可为expires/max_age/path/domain/secure;非str
#使用JQuery操作Cookie:需要先引入JQuery,再引入jquery.cookie.js
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.cookie.js"></script>
$.cookie("<cookie_key>","<cookie_value>",{<key>:<value>});
#参数说明:
key:指定参数;可为expires/maxAge/path/domain/secure;非str
(2)操作Session(Session默认保存15天):
#获取Session:
<request>.session["<key>"]
#设置Session:
<reqeust>.session["<key>"]="<value>"
#删除Session:实际是把session_data更新为其他值,并非立即删除
del <request>.session["<key>"]
#设置Session的有效时间:
<request>.session.set_expiry(<value>)
#参数说明:
value:指定有效时间
如果>0,会在value秒后失效
如果是datatime/timedelta,会在该时间后失效
如果是0,会在关闭浏览器时失效
如果是None,依赖全局session失效策略
二.实例
- 目录结构:
- 代码:
<!--login.html:登录页面-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
<link rel="stylesheet" href="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<form action="login.html" method="post">
<div class="form-group">
<label class="sr-only">username</label>
<input type="text" class="form-control" name="username" placeholder="用户名"/>
</div>
<div class="form-group">
<label class="sr-only">Password</label>
<input type="password" class="form-control" name="passwd" placeholder="密码"/>
</div>
<div class="form-group">
<input class="btn btn-primary" type="submit" value="http://830909.blog.51cto.com/8311014/Submit">
</div>
</form>
</div>
<script type="application/Javascript" src="http://830909.blog.51cto.com/static/js/jquery-2.2.1.min.js"></script>
<script type="application/javascript" src="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/js/bootstrap.min.js"></script>
</body>
</html>
<!--backend.html:后台页面-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>backend</title>
<link rel="stylesheet" href="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/css/bootstrap.min.css">
<link rel="stylesheet" href="http://830909.blog.51cto.com/static/css/commons.css">
</head>
<body>
<div class="container">
<h2>cookie 内容是 {{ cookie_content }}</h2>
<h2>session 内容是 {{ session_content }}</h2>
<h2>登录用户名 :{{ username }}</h2>
<a href="http://830909.blog.51cto.com/logout/">注销</a>
</div>
<script type="application/javascript" src="http://830909.blog.51cto.com/static/js/jquery-2.2.1.min.js"></script>
<script type="application/javascript" src="http://830909.blog.51cto.com/static/plugins/bootstrap-3.3.5-dist/js/bootstrap.min.js"></script>
</body>
</html>
#views.py:综合使用Cookie和Session
#/usr/bin/env python
#coding=utf-8
from django.shortcuts import render,redirect
def login(request):
if request.method=="POST":
username=request.POST['username']
pwd=request.POST['passwd']
#print(request.COOKIES)#打印请求的Cookie值
if username=='abc' and pwd=='123':
#设置session内部的字典内容
request.session['is_login']='true'
request.session['username']='abc'
#登录成功就重定向到后台的URL
return redirect('/backend/')
#登录不成功或第一访问就停留在登录页面
return render(request,'login.html')
def backend(request):
#这里必须用读取字典的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']
#username=request.session.get("username")
return render(request,'backend.html',
{'cookie_content':cookie_content,
'session_content':session_content,
'username':username
})
else:
#如果访问的时候没有携带正确的session,
#就直接被重定向url回login页面
return redirect('/login/')
def logout(request):
#直接通过request.session['is_login']回去返回的时候
#如果is_login对应的value值不存在会导致程序异常
#所以需要做异常处理
try:
#删除is_login对应的value值
del request.session['is_login']
except KeyError:
pass
#点击注销之后,直接重定向回登录页面
return redirect('/login/')
#views.py中:只使用Cookie
#/usr/bin/env python
#coding=utf-8
from django.shortcuts import render,redirect
def login(req):
if req.method=="POST":
name=req.POST.get("name")
ped=req.POST.get("pwd")
if name="John" and pwd="123":
ret=redirect("/index")
ret.set_cookie("username",name,max_age=10)
#最大有效时间为10s,之后失效;为秒数
#expire也为最大有效时间,但为时间字符串;默认为15天
#ret.set_cookie("username",{"name":name})
return ret
return render(req,"login.html")
def index(req):
username=req.COOKIES.get("username",None)#默认值为None
if username=="John":
return render(req,"index.html",locals())
else:
return redirect("/login")
#url.py中:
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^backend/', views.backend),
url(r'^logout/', views.logout),
]