cookie与session操作

cookie与session操作

一、cookie与session简介

1、cookie简介

由于http请求是无状态的,无法记录用户的身份,所以需要有一种机制来长期的保存和校验用户的身份,最先出现的是cookie

  cookie:是由服务器下发到用户(浏览器)本地用于校验身份的数据(键值对)

cookie工作机制:

  当第一次登陆成功之后,服务端返回一个随机字符串(cookie)保存在客户端浏览器上,之后再次朝服务端发送请求,只需要携带该随机字符串,服务端就能够识别当前用户身份

由于cookie是由服务器下发到用户本地的,所以导致了一些安全性问题:

  • 用户可以拒收cookie
  • 用户可以仿造cookie

 

2、session简介

session就是为了解决cookie的安全性问题提出的一种新的回话控制技术,session的使用依赖于cookie

session存放在服务器的数据库(django_session表)

django中默认的session超时时间为14天

  使用session之后,不会再次直接向服务器下发cookie身份信息,下发的是一个随机不重复的session_id,用户携带session_id访问服务器,服务器通过session_id判断身份,下发cookie。再次校验

服务器校验的内容有:

  • session和cookie是否对应
  • session是否过期
  • cookie是否合法

 

3、cookie和session对比

cookie放在用户本地,session存在服务器数据库当中

校验cookie速度比较快,但安全性不够好

校验session速度比较慢,安全性相对好

 

 

二、cookie操作

1、设置cookie

# obj = render()
# obj = redirect()
obj.set_cookie(key, value)  # 设置键值对{key: value}
return obj

后端views.py代码:

def index2(request):
    obj = HttpResponse("it's index2.html")
    obj.set_cookie('key', 'value')  # 传入的前两个参数是cookie键值对
    return obj

 

2、获取cookie

request.COOKIES.get('key')  # cookie键值对取值
request.path_info  # 只拿根路径部分
request.get_full_path()  # 拿全路径,路径加参数

后端views.py代码:

def index2(request):
    obj = HttpResponse("it's index2.html")
    obj.set_cookie('key', 'value')  # 传入的前两个参数是键值对
    print(request.COOKIES.get('key'))  # cookie键值对取值
    print('request.path_info', request.path_info)  # 只拿根路径部分
    print('request.get_full_path()', request.get_full_path())  # 拿全路径路径加参数
    return obj

 

3、删除cookie

obj = HttpResponse()
# obj = render()
# obj = redirect()
obj.set_cookie('key', 'value')  # 传入的前两个参数是键值对
obj.delete_cookie('key')  # 删除cookie键值对
return obj

后端views.py代码:

def index2(request):
    obj = HttpResponse("it's index2.html")
    obj.set_cookie('key', 'value')  # 传入的前两个参数是键值对
    print(request.COOKIES.get('key'))  # cookie键值对取值
    obj.delete_cookie('key')  # 删除
    print(request.COOKIES.get('key'))  # cookie键值对取值
    return obj

 

4、登录认证装饰器

需求:写一个登陆认证装饰器:限制登陆用户名密码之后才能够访问其他网页

后端view.py代码:

from functools import wraps


# 登陆认证装饰器
def login_auth(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        print('request.path_info', request.path_info)
        print('request.get_full_path()', request.get_full_path())
        target_url = request.path_info

        # 执行被装饰函数之前可以做的事情
        if request.COOKIES.get('username'):
            res = func(request, *args, **kwargs)
        else:
            return redirect('/login/?next=%s' % target_url)
        return res
    return inner

 

5、例:使用登陆认证装饰器

演示:使用登陆认证装饰器并装饰其他页面,限制登陆用户名密码之后才能够访问其他网页,cookie超时时间为60秒

后端view.py代码:

from django.shortcuts import render, HttpResponse, redirect
from functools import wraps


# 登陆认证装饰器
def login_auth(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        print('request.path_info', request.path_info)
        print('request.get_full_path()', request.get_full_path())
        target_url = request.path_info

        # 执行被装饰函数之前可以做的事情
        if request.COOKIES.get('username'):
            res = func(request, *args, **kwargs)
        else:
            return redirect('/login/?next=%s' % target_url)
        return res
    return inner


# 登陆页面:登陆成功前端自动生成cookie键值对
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'tank' and password == '123':
            # target_url = request.GET.get('next', '/home/')
            target_url = request.GET.get('next')
            # 判断用户登录之前是否有想要访问的url
            if target_url:
                # 保存用户登录状态
                obj = redirect(target_url)
            else:
                obj = redirect('/home/')
            # 设置cookie
            obj.set_cookie('username', 'jackie', max_age=60)  # max_age设置超时时间为60s
            return obj
    return render(request, 'login.html')


# 登陆之后可以访问home页面
@login_auth
def home(request):
    if request.COOKIES.get('username'):
        print(request.COOKIES)
        return HttpResponse('我是home页面')
    else:
        return redirect('/login/')
    # return HttpResponse('我是home页面')


# 登陆之后可以访问index页面
@login_auth
def index(request):
    return HttpResponse('我是index页面')


# 登陆之后可以访问demo页面
@login_auth
def demo(request):
    return HttpResponse('我是demo页面')


# 注销页面:登陆之后可以访问logout页面
@login_auth
def logout(request):
    obj = HttpResponse('已注销')
    obj.delete_cookie('username')
    return obj
views.py

后端urls.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'^index/', views.index,),
    url(r'^demo/', views.demo,),
    url(r'^home/', views.home,),
    url(r'^logout/', views.logout,),
]
urls.py

前端login.html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css">
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <form action="" method="post" novalidate>
                <p>username:
                    <input type="text" name="username" class="">
                </p>
                <p>password:
                    <input type="text" name="password">
                </p>
                <p>
                    <input type="submit">
                </p>
            </form>
        </div>
    </div>
</div>
</body>
</html>
login.html

 

 

三、session操作

1、设置session

request.session['key'] = value  # session键值对
return HttpResponse()
"""
设置session内部发生的事情:
  1.django内部会自动生成一串随机字符串   2.去django_session表中存储数据,键就是随机字符串,值就是保存的数据   3.将生成的随机字符串返回给客户端浏览器,浏览器保存键值对   sessionid 随机字符串
"""

后端views.py代码:

def set_session(request):
    request.session['name'] = 'jackie'
    request.session.set_expiry(60)  # 设置session超时时间为60s
    """
    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。

    """
    return HttpResponse('我是set_session页面')

 

2、获取session

print(request.session.get(key))  # session键值对取值
return HttpResponse()
"""
获取session内部发生的事情:
    1.django内部会自动生成一个随机字符串
    2.去django_session表中存储数据,键就是随机字符串,值就是保存的数据
    3.将生成的随机字符串返回给客户端浏览器,浏览器保存键值对
    sessionid    随机字符串
"""

后端views.py代码:

def get_session(request):
    # print(request.session)  # <django.contrib.sessions.backends.db.SessionStore object at 0x0000000004122688>
    print(request.session.get('name'))
    return HttpResponse('我是get_session页面')

 

3、删除session

# 删除session有两种方式:
# request.session.delete()  # 第一种方法:删除当前会话的所有Session数据
request.session.flush()   # 第二种方法:删除当前的会话数据并删除会话的Cookie   *****推荐使用*****
"""
这用于确保前面的会话数据不可以再次被用户的浏览器访问
    例如:django.contrib.auth.logout() 函数中就会调用它。
"""
return HttpResponse()

后端views.py代码:

def del_session(request):
    print(request.session.get('name'))
    request.session.flush()
    print(request.session.get('name'))
    return HttpResponse('我是del_session页面,session已删除')

posted @ 2020-12-13 22:34  chchcharlie、  阅读(223)  评论(0编辑  收藏  举报