关于cookie和session的认识

一、关于cookie的产生的原因

  • 1、由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户
  • 2、但是服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用Cookie来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如sid=xxxxx 这样的参数(或者在请求头里面加上一个token是比较常见的,就是用来标识用户),服务端据此来识别用户。
  • 3、Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。

二、在django中获取cookie

  • 1、直接使用request.COOKIES来获取cookies,获取到的cookies是一个字典,可以直接取值出来

    from django.shortcuts import render, HttpResponse
    from django.views import View
    
    class LoginView(View):
        def get(self, request):
            print(request.COOKIES)
            return render(request, 'test1.html')
    
        def post(self, request):
            print('request====', request.POST)
            print(request.COOKIES)
            return HttpResponse('成功')
    
  • 2、服务器端设置cookie(使用ret.set_cookie(key, val))

    class LoginView(View):
        def get(self, request):
            print(request.COOKIES)
            return render(request, 'test1.html')
    
        def post(self, request):
            print('request====', request.POST)
            print(request.COOKIES)
            username = request.POST.get('username', None)
            passwd = request.POST.get('passwd', None)
            if username == '123' and passwd == 'admin123':
                # 登录成功设置cookie
                ret = redirect('/test1/index')
                ret.set_cookie('username', username)
                return ret
            return HttpResponse('登录失败')
    
    class IndexView(View):
        def get(self, request):
            print('获取的cookie', request.COOKIES)
            return render(request, 'index.html')
    
  • 3、cookie设置时间(不指定是2周)

    ...
    # 这里的时间是按天来计算的
    ret.set_cookie('username', username, max_age=1)
    ...
    

二、关于cookie的缺陷

  • 1、前面说到的http是无状态的,我们一般会用cookie来标识用户
  • 2、既然是这样,cookie中肯定有用户信息,被人劫持了就可以获取用户一些基本信息
  • 3、由于cookie直接在浏览器上可以查看到,很容易被人劫持

图片

三、关于sessioncookie配合使用

由于前面说到的cookie会被人劫持获取到用户信息,因此才产生了session(注意不是前端本地存储的window.sessionStorage)

session存在服务器端,cookie存在客户端,现在服务器端给浏览器的就是一个key(通俗点就是一个钥匙),用户请求的时候都要携带这个key(钥匙),服务器端拿到客户端的这个key然后进行校验(俗称开锁),如果匹配成功就表示当前用户是有效的,否则是无效的.

四、session的使用

  • 1、django中关于session是存放在中间件中

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware', # session的中间件
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
  • 2、获取session的方法(request.session)

    # 获取到的session是一个对象
    获取session <django.contrib.sessions.backends.db.SessionStore object at 0x109e7ecf8>
    
  • 3、由于session是存在数据库中要先生成表

    python manage.py makemigrations
    python manage.py migrate
    
  • 3、设置session

    class LoginView(View):
        def get(self, request):
            print(request.COOKIES)
            return render(request, 'test1.html')
    
        def post(self, request):
            username = request.POST.get('username', None)
            passwd = request.POST.get('passwd', None)
            if username == '123' and passwd == 'admin123':
                # 登录成功设置session
                request.session['username'] = username
                request.session['is_login'] = True
                return redirect('/test1/index')
            return HttpResponse('登录失败')
    
  • 4、获取session

    class IndexView(View):
        def get(self, request):
            print('获取session', request.session.get('is_login'))
            print('获取session', request.session.get('username'))
            return render(request, 'index.html')
    
  • 5、查看数据库中存储的session

    • 1.我们自己都不知道存的是什么东西
    • 2.没有设置过期时间默认是2week(14day)

    图片

  • 6、session设置时间

    request.session.set_expiry(valule)
    
    • 1.如果vaule是一个整数表示,session在这毫秒后就会失效
    • 2.如果vaule是一个datatime或者timedelta表示,session在这个时间点后就会失效
    • 3.如果vaule是一个0表示,session在浏览器关闭好就会失效
    • 4.如果vaule是一个None表示,session会依赖全局的session策略

五、前面说的客户端存储是一个key,拿去与服务器端对比

图片

results matching ""

    No results matching ""