当前位置: 首页 > article >正文

Flask session cookie 失效在Safari中的解决方法

Flask 会默认使用客户端会话管理,数据存储在浏览器的 cookie 中。这种方法通常在各种浏览器中工作良好,但有时可能会在 Safari 中遇到 session cookie 失效的问题,特别是使用了 iOS 或 macOS 上的 Safari。

这个问题常见的原因是 Safari 中的隐私设置,尤其是涉及到“防止跨站追踪”和第三方 cookie 的处理。Safari 默认可能会阻止 Flask session cookie 的写入或读取,从而导致 session 丢失。以下是一些解决方法:

在这里插入图片描述

1、问题背景

最近在使用 Flask 开发 web 应用时,遇到了一个奇怪的问题:在 macOS 上运行 Flask 应用,所有浏览器都能正常设置 session cookie。但在 Windows 服务器上运行时,Safari(以及 iOS)却无法设置 session cookie,而其他浏览器仍然可以正常工作。

下面是一个简单的 Flask 应用示例,用来演示这个问题:

import os
import uuid
from flask import Flask, render_template, session

app = Flask(__name__)

SESSION_LIFETIME = 3600

@app.before_request
def before_request():
    # 创建 session
    if not session.get('uid'):
        session.permanent = True
        session['uid'] = uuid.uuid4()

@app.route('/', methods=['GET'])
def test():
    return render_template('test.html')

if __name__ == "__main__":
    app.secret_key = os.urandom(24)
    app.permanent_session_lifetime = SESSION_LIFETIME
    app.debug = True
    app.run(threaded=True,
            host="0.0.0.0",
            port=int("5000")
            )
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>Wubwub</title>
</head>
<body>
Jojo
</body>
</html>

为什么这个代码在所有浏览器上都能正常工作,但在 Safari 中却不行?而且,相同的代码在 macOS 上运行时(无论是在本地还是远程访问),都能正常工作,但是在 Windows 上却不行?其他所有浏览器在 Windows 上都能正常使用(即使是从外部访问)。

2、解决方案

经过排查,发现这个问题的原因是 Safari 和 iOS 对 cookie 的处理方式不同。Safari 和 iOS 会在默认情况下阻止第三方 cookie 的设置。而 Flask 默认使用第三方 cookie 来存储 session 数据。因此,在 Safari 和 iOS 中,Flask 的 session cookie 无法被设置。

要解决这个问题,有两种方法:

  1. 修改 Flask 的配置,使其使用第一方 cookie 来存储 session 数据。
  2. 在 Safari 和 iOS 中启用对第三方 cookie 的支持。

方法 1:修改 Flask 的配置

要修改 Flask 的配置,使其使用第一方 cookie 来存储 session 数据,可以在初始化 Flask 应用时,设置 session_cookie_samesite 参数为 'Lax'。如下所示:

app = Flask(__name__)

SESSION_LIFETIME = 3600

app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'

@app.before_request
def before_request():
    # 创建 session
    if not session.get('uid'):
        session.permanent = True
        session['uid'] = uuid.uuid4()

@app.route('/', methods=['GET'])
def test():
    return render_template('test.html')

if __name__ == "__main__":
    app.secret_key = os.urandom(24)
    app.permanent_session_lifetime = SESSION_LIFETIME
    app.debug = True
    app.run(threaded=True,
            host="0.0.0.0",
            port=int("5000")
            )

方法 2:在 Safari 和 iOS 中启用对第三方 cookie 的支持

要在 Safari 和 iOS 中启用对第三方 cookie 的支持,可以按照以下步骤操作:

  1. 打开 Safari 浏览器。
  2. 点击“Safari”菜单。
  3. 选择“偏好设置”。
  4. 点击“隐私”选项卡。
  5. 在“阻止跨站点跟踪”下,选择“允许来自访问过的网站”。

这样,Safari 和 iOS 就会允许 Flask 设置 session cookie 了。

总结

这个问题的根本原因是 Safari 和 iOS 对 cookie 的处理方式不同。Safari 和 iOS 会在默认情况下阻止第三方 cookie 的设置。而 Flask 默认使用第三方 cookie 来存储 session 数据。因此,在 Safari 和 iOS 中,Flask 的 session cookie 无法被设置。

要解决这个问题,有两种方法:

  1. 修改 Flask 的配置,使其使用第一方 cookie 来存储 session 数据。
  2. 在 Safari 和 iOS 中启用对第三方 cookie 的支持。

通过这些步骤,应该可以有效解决 Safari 中 Flask session cookie 失效的问题。


http://www.kler.cn/a/299028.html

相关文章:

  • 有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?
  • nginx自定义错误日志
  • [Python学习日记-73] 面向对象实战1——答题系统
  • PostgreSql-学习06-libpq之同步命令处理
  • Linux应用软件编程-文件操作(标准io)
  • 三七互娱Java开发150道面试题及参考答案(下)
  • 《OpenCV计算机视觉》—— 图像金字塔
  • 记MySQL查询视图出现字符集编码不一致问题
  • redis的 stream数据类型实现 消息队列?
  • 在Vue 3中优化异步数据加载:利用`onMounted`与`Promise.all`
  • Spring Integration SFTP集成
  • 前端框架有哪些?全面解析主流前端框架
  • 【H2O2|全栈】关于CSS(1)CSS基础(一)
  • Android13默认开启电池百分比数字显示Framework
  • 项目答辩总结
  • NISP 一级 | 3.3 网络安全防护与实践
  • 取指操作流程
  • JavaWeb案例-登录认证
  • 【MRI基础】回波序列长度-echo train length ETL概念
  • 基于python+大数据爬虫技术+数据可视化+Spark的电力能耗数据分析与可视化平台设计与实现
  • UnLua调用蓝图变量、动画、函数
  • CSP-J 算法基础 排序算法的基本概念
  • 【Rust练习】12.枚举
  • SLM561A​​系列 60V 10mA到50mA线性恒流LED驱动芯片 为智能家居照明注入新活力
  • 【C-实践】文件服务器(1.0)
  • 如何识别和防范跨站请求伪造(CSRF)?