Django——会话.Cookie&Session

简介: Django——会话.Cookie&Session

Django——会话.Cookie&Session

一、Cookie

会话指的是浏览器与web服务器之间的通信。HTTP协议是无状态协议。web服务器无法知道用户上一次会话数据,用来维护用户在访问网站过程中的状态 , 会话控制使用 Cookie 和 Session 一起实现。

通常把 Session 称为会话对象 , web服务器会给每一个用户创建一个 Session 对象 ,Session 对象在服务器端保存用户数据。Cookie 用于浏览器端保存用户数据。

Cookie 原理:当客户端访问服务端的时候,服务器会生成一份 Cookie 数据传输给浏览器,浏览器会自动把这份 Cookie 数据保存起来。之后浏览器在每一次请求访问的时候都回自动的携带这个 Cookie 数据。

Cookie保存是文本数据,以键值对的方式保存信息

def cookie_set(request):
    # 设置 Cookie 数据,因为 Cookie 要响应给浏览器
    # 所以设置 Cookie 数据要使用 HttpResponse 对象或者其子类对象
    # Cookie 数据在浏览器中保存的时间默认为 2 周
    response = HttpResponse('设置 Cookie 数据')
    # set_cookie(key , value) , 设置 Cookie 的数据不能是中文
    # max_age 设置过期时间, 单位:秒
    # expires 以时间对象为单位设置过期时间 , datetime.timedelta()
    response.set_cookie('name','ac' , max_age=30)
    # datetime.datetime.now()+datetime.timedelta(days=2) 设置两天后过期
    response.set_cookie('age','27' , expires=datetime.datetime.now()+datetime.timedelta(days=2))
    return response
def cookie_get(request):
    print(request.COOKIES)
    print(request.COOKIES.get('name'))
    return HttpResponse('获取 Cookie 数据')
def cookie_del(request):
    # 删除 Cookie 数据需要通过使用 HttpResponse 对象或者其子类对象
    response = HttpResponse('设置 Cookie 数据')
    # delete_cookie 删除 Cookie 数据
    response.delete_cookie('age')
    return response

验证登录

def index(request):
    return render(request , 'index.html')
def login(request):
    if request.method == 'GET':
        return render(request , 'login.html')
    name =request.POST.get('username')
    password =request.POST.get('password')
    if not all([name , password]):
        return render(request , 'login.html',{'error':'用户名或者密码错误'})
    # 获取请求中的重定向 url 的参数
    url = request.GET.get('redirect_url')
    # 判断是否有携带这个重定向的 url 参数
    # 有,登录成功之后重定向到参数指定的 url 中
    # 没有 , 默认响应首页
    if url:
        response = redirect(url)
    else:
        response = redirect('/index/')
    response.set_cookie('cookie_data' , name)
    return response
def cart(request):
    # 获取浏览器请求中的 Cookie 数据
    res = request.COOKIES.get('cookie_data')
    # 判断是否有携带制定的键值对数据
    if res:
        return HttpResponse('购物车页面')
    else:
        # 浏览器没有这份数据,需要进行登录
        url = request.path
        return redirect(f'/login/?redirect_url={url}')
def wap(func):
    def inner(request , *args , **kwargs):
        # 获取浏览器请求中的 Cookie 数据
        res = request.COOKIES.get('cookie_data')
        # 判断是否有携带制定的键值对数据
        if res:
            # 返回对应的视图函数
            return func(request)
        else:
            # 浏览器没有这份数据,需要进行登录
            url = request.path
            return redirect(f'/login/?redirect_url={url}')
    return inner
@wap
def cart(request):
    return HttpResponse('购物车页面')
@wap
def info(request):
    return HttpResponse('个人信息页面')

Cookie 保存数据大小是有限制的,最大保存 4KB;

一个服务器最多在浏览器上保存 20 个 Cookie 数据;

一个浏览器最多保存 300 个 Cookie。

二、Session

Session 跟 Cookie不同的是 Session 数据是保存在服务器中。

当浏览器第一次请求去服务器的时候,服务器会生成一份 Session 的 id 编号给浏览器,是以 Cookie 的形式发给浏览器, 后续浏览器的请求,都会携带这个份 id 进行访问。

Session也是键值对的方式保存用户数据,Session 在服务器给每一个用户创建一个 Session 对象,对象的 id 值是保存在数据库中。

在操作 Session 的数据必须先迁移数据库。

def session_set(request):
    # 设置 Session 数据,通过 request 进行设置
    # 保存 Session 数据之后,会自动生成 sessionid 的数据保存到数据库:django_session 表中
    request.session['name'] = '阿宸'
    request.session['age'] = '27'
    # 设置过期时间 , 单位:秒
    request.session.set_expiry(60)
    return HttpResponse('设置 Session 数据')
def session_get(request):
    res = request.session.get('name')
    return HttpResponse(f'获取 Session 的数据为:{res}')
def session_del(request):
    # 清楚过期的 Session 数据
    # request.session.clear_expired()
    # del request.session['name']
    # 清空所有的数据
    # request.session.delete()
    request.session.flush()
    return HttpResponse('ok')

三、跨站点防御

CSRF:跨站点请求伪造

CSRF指攻击者盗用你的身份,以你的名义发送恶意请求(盗取你的账号 , 购买商品 , 窃取你的个人信息)


防止 CSRF 的攻击,Django 在中间件中做了 CSRF 的预防机制。

浏览器第一次访问 服务端的时候,Django 会自动随机生成 token 数据以 Cookie 形式发送给浏览器。当浏览器发送了 post 请求的时候,服务端都会进行自动检查 token是否和保存的一致。以这种方式进行避免 csrf 的攻击。

Django 配置的 中间件的 CSRF 只对 post 请求有效,get 请求无效

相关文章
|
3天前
|
存储 前端开发 Java
【SpringMVC】——Cookie和Session机制
获取URL中参数@PathVarible,上传文件@RequestPart,HttpServerlet(getCookies()方法,getAttribute方法,setAttribute方法,)HttpSession(getAttribute方法),@SessionAttribute
|
24天前
|
存储 安全
Cookie会话跟踪的原理
会话跟踪技术包括Cookie和Session。Cookie是客户端技术,首次访问时服务器通过Set-Cookie响应头发送Cookie,浏览器保存并在后续请求中通过Cookie请求头回传,实现会话跟踪。但Cookie易被用户修改或禁用,安全性较低。Session则是服务器端技术,每次会话生成唯一的Session ID,通过Cookie传递给客户端,客户端在后续请求中携带此ID,服务器据此识别会话。Session更安全,但在集群环境中需解决会话共享问题。
40 1
|
1月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
75 4
|
1月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
2月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
211 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
2月前
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
37 1
|
3月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
3月前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
3月前
|
存储 安全 NoSQL
Cookie、Session、Token 解析
Cookie、Session、Token 解析
73 0
|
4月前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
315 0