跳到主要内容

[toc]

cookie和session

一、cookie

1.1 cookie的由来

http协议是无状态的,无状态的意思就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,对于服务器来讲,每次都请求都是全新的

状态可以理解为客户端和服务端在某次会话中产生的数据,那无状态的情况下,产生的数据就不会被保存,而会话产生的数据又是需要我们保存的,经典的需求就是客户端登陆服务端后,服务端需要记住客户端是谁,而不用每次都重新登陆,这样就产生了cookie

1.2 cookie是什么

cookie是浏览器的技术,cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组简直对,可以理解为服务端给客户端的一个小甜点,下次客户端的浏览器访问服务器时就会自动携带这些键值对,一便服务器提取有用信息

##1.3cookie的原理

cookie的工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,浏览器收到内容后保存在本地,当浏览器再次访问服务器时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断请求者是谁了

查看cookie

iShot_2024-08-30_16.33.11

cookie原理示意图

iShot_2024-08-30_16.34.15

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后用户需要重新登陆

login

查看浏览器中的cookie

iShot_2024-08-30_16.35.45

二、session

2.1 session是什么

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

session图解

iShot_2024-08-30_16.39.11

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标记的是浏览器,不是用户,一个浏览器对应一个服务端