cookie和session

一、cookie

1.1cookie的由来

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

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

1.2cookie是什么

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

1.3cookie的原理

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

查看cookie

iShot2020-10-16 15.11.05

cookie原理示意图

iShot2020-10-16 15.11.40

1.4cookie规范

  • Cookie大小上限为4KB,是总数大小为4KB不是单个
  • 一个服务器最多在客户端浏览器上保存20个Cookie
  • 一个浏览器最多保存300个Cookie,因为一个浏览器可以访问多个服务器

  • 不同浏览器之间是不共享Cookie的

1.5cookie和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.6cookie的覆盖

如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

1.7django中操作cookie

1.7.1django设置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.2django删除cookie

删除cookie: 
  ret = redirect("/login/")
  ret.delete_cookie('cookie键名称')

1.7.3cookie版登陆校验示例

用户访问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

iShot2020-10-16 15.13.00

二、session

2.1session是什么

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

session图解

iShot2020-10-16 15.13.22

2.2session详细流程

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.3session规范

  • 借助于cookie进行传输
  • 非明文显示
  • 长度不限

2.4django中操作session

2.4.1django设置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.2django删除session

request.session.flush()

2.4.3session版登陆校验示例

用户访问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标记的是浏览器,不是用户,一个浏览器对应一个服务端
泡泡吐肥皂o © gitbook.pptfz.top 2021 all right reserved,powered by Gitbook文件修订时间: 秃笔南波湾!!!

results matching ""

    No results matching ""