[toc]
cookie和session
一、cookie
1.1 cookie的由来
http协议是无状态的,无状态的意思就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,对于服务器来讲,每次都请求都是全新的
状态可以理解为客户端和服务端在某次会话中产生的数据,那无状态的情况下,产生的数据就不会被保存,而会话产生的数据又是需要我们保存的,经典的需求就是客户端登陆服务端后,服务端需要记住客户端是谁,而不用每次都重新登陆,这样就产生了cookie
1.2 cookie是什么
cookie是浏览器的技术,cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组
简直对
,可以理解为服务端给客户端的一个小甜点,下次客户端的浏览器访问服务器时就会自动携带这些键值对,一便服务器提取有用信息
##1.3cookie的原理
cookie的工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,浏览器收到内容后保存在本地,当浏览器再次访问服务器时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断请求者是谁了
查看cookie
cookie原理示意图
1.4 cookie规范
-
Cookie大小上限为4KB,是总数大小为4KB不是单个
-
一个服务器最多在客户端浏览器上保存20个Cookie
-
一个浏览器最多保存300个Cookie,因为一个浏览器可以访问多个服务器
-
不同浏览器之间是不共享Cookie的
1.5 cookie和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
1.6 cookie的覆盖
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。
1.7 django中操作cookie
1.7.1 django设置cookie
设置cookie
#方式一
获取cookie:
request.COOKIES.get('xx')
设置cookie:
HttpResponse('xx').set_cookie('键','值')
#方式二
获取签名cookie:
request.get_signed_cookie('is_login',salt='xxx')
设置签名cookie:
ret.set_signed_cookie('is_login',True,'xxx')
设置cookie中的参数
key #cookie的键
value='' #cookie的值
max_age=None #超时时间,单位秒,经过多少秒后cookie失效,默认两周
expires=None #超时时间(IE requires expires, so set it if hasn't been already.),例如,当前时间为1月1日10时10分,设置为7就是1月8日的10时10分失效
path='/' #Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain=None #Cookie生效的域名
secure=False #https传输
httponly=False #只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
cookie设置时不要设置中文!!!因为不专业!!!
如果非要设置中文的解决方法
#方式1
def login(request):
ret = HttpResponse('ok')
ret.set_cookie('k1','你好'.encode('utf-8').decode('iso-8859-1'))
#取值:request.COOKIES['k1'].encode('utf-8').decode('iso-8859-1').encode('iso-8859-1').decode('utf-8')
return ret
#方式2 json
def login(request):
ret = HttpResponse('ok')
import json
ret.set_cookie('k1',json.dumps('你好'))
#取值 json.loads(request.COOKIES['k1'])
return ret
1.7.2 django删除cookie
删除cookie:
ret = redirect("/login/")
ret.delete_cookie('cookie键名称')
1.7.3 cookie版登陆校验示例
用户访问login,登陆成功重定向到页面home展示内容
urls文件
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,name='login'),
url(r'^home/', views.home,name='home'),
]
views文件
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def login(request):
if request.method == 'GET':
return render(request,'login.html')
else:
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'admin' and password == 'admin':
ret = redirect('home')
#这里是我们自己设置cookie
ret.set_cookie('is_login',True)
# return redirect('home')
return ret
else:
return redirect('login')
def home(request):
#这里获取上边我们自己设置的cookie
is_login = request.COOKIES.get('is_login')
if is_login == 'True':
return render(request,'home.html')
else:
return redirect('login')
html文件
#login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录页面</h1>
<form action="" method="post">
{% csrf_token %}
用户名: <input type="text" name="username">
密码: <input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
#home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎来到乔杉大保健会所</h1>
</body>
</html>
整体的逻辑是用户登陆成功后返回home页面,直接访问home页面不可以,清除cookie后用户需要重新登陆
查看浏览器中的cookie
二、session
2.1 session是什么
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
session图解
2.2 session详细流程
1.当用户登陆之后,服务端生成一个字典 {'key':'value'}
,并且将字典存入session,key是服务端自动生成的一段字符串标示,返回cookie,value是一个自定义格式的字典,这个字典的内容由我们自己决定
2.在1中生成的字典value中自定义格式来存储用户信息,如用户名、密码等等
3.当我们在django中用到session时,cookie由服务端随机生成,写到浏览器的cookie中,每个浏览器都有自己的cookie值,是session寻找用户信息的唯一标识,每个浏览器请求到后台的接收的request_session等价于1中session字典的key(cookie)对应的value
2.3 session规范
- 借助于cookie进行传输
- 非明文显示
- 长度不限
2.4 django中操作session
2.4.1 django设置session
//session可以设置多个
request.session['is_login'] = True
request.session['username'] = username
//获取session
request.session.get('is_login')
request.session.get('username')
django设置session过程
- 1.生成随机字符串
- 2.放到cookie中进行传输
- 3.将随机字符串和对应数据保存到自己服务端的数据库中
django获取session过程
1.取出cookie中的session随机字符串 {'sessionid':'asdfasfpoaijsdgihsdj'} xx = request.COOKIES.get('sessionid')
2.到数据库中查询这个sessionid对应的那条记录
data = select session_data from django_session where session_key = xx;
3.拿出记录中的session_data数据部分进行解密,并取出数据
dic.get('is_login') --> True
dic = ss(data) --> {'is_login':True}
django删除session过程
1.删除cookie中的sessionid那个键值对
2.删除数据库中的这条记录
2.4.2 django删除session
request.session.flush()
2.4.3 session版登陆校验示例
用户访问login,登陆成功重定向到页面home展示内容
urls文件
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,name='login'),
url(r'^home/', views.home,name='home'),
]
views文件
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def login(request):
if request.method == 'GET':
return render(request,'login.html')
else:
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'admin' and password == 'admin':
request.session['is_login'] = True
request.session['username'] = username
"""
设置session后做的3件事
1.生成随机字符串
2.放到cookie中进行传输
3.将随机字符串和对应数据保存到自己服务端的数据库中
"""
return redirect('home')
else:
return redirect('login')
def home(request):
#这里获取上边我们自己设置的session
is_login = request.session.get('is_login')
"""
request.session.get做的事
1.取出cookie中的session随机字符串{'sessionid':'asdfasfpoaijsdgihsdj'}
xx = request.COOKIES.get('sessionid')
2.到数据库中查询这个sessionid对应的那条记录
data = select session_data from django_session where session_key = xx;
3.拿出记录中的session_data数据部分进行解密,并取出数据
dic = sss(data) --> {'is_login':True}
dic.get('is_login') --> True
"""
if is_login == True:
return render(request,'home.html')
else:
return redirect('login')
def logout(request):
#删除session
request.session.flush()
"""
删除session
1.删除cookie中的sessionid那个键值对
2.删除了数据库中的这条记录
"""
return redirect('login')
html文件
#login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录页面</h1>
<form action="" method="post">
{% csrf_token %}
用户名: <input type="text" name="username">
密码: <input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
#home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎来到乔杉大保健会所</h1>
<a href="/logout/">注销</a>
</body>
</html>
cookie与session总结
cookie的作用: 保持会话,使用户不需要重复的去登录
1.有大小限制,Cookie总大小上限为4KB;
2.有个数限制
一个服务器最多在客户端浏览器上保存20个Cookie;
一个浏览器最多保存300个Cookie,因为一个浏览器可以访问多个服务器。
session
1.比cookie面上安全一些
2.session没有大小限制
3.可以配置多个存储方案,可以配置到缓存中
django session表中session key标记的是浏览器,不是用户,一个浏览器对应一个服务端