You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Flask会话60分钟超时且浏览器关闭即终止?

Flask会话同时实现超时与浏览器关闭终止的方案

不用依赖JavaScript或者session.permanent的取巧方法,完全靠后端逻辑就能搞定这两个需求,核心思路是利用Flask默认的临时会话cookie,再手动加超时验证:

具体实现步骤

1. 登录时记录会话过期时间

用户通过SAML登录成功后,除了存储用户信息,额外在session里存一个60分钟后过期的时间戳:

from datetime import datetime, timedelta
from flask import Flask, session, redirect, url_for, request

app = Flask(__name__)
app.secret_key = '你的密钥'  # 必须设置,用来给session签名加密

@app.route('/saml-login-success')
def saml_login_success():
    # 这里已经完成SAML认证流程,拿到用户信息
    session['user_info'] = {'user_id': '123', 'username': 'Chris'}
    # 设置60分钟后过期的时间戳
    session['expires_at'] = (datetime.now() + timedelta(minutes=60)).timestamp()
    return redirect(url_for('dashboard'))

2. 全局检查会话超时

用Flask的before_request钩子,每次处理请求前先检查会话是否超时:

@app.before_request
def check_session_timeout():
    # 跳过登录相关路由,避免循环跳转
    if request.path in ['/saml-login', '/saml-login-success']:
        return
    
    # 检查session里有没有用户信息和过期时间
    if 'user_info' in session and 'expires_at' in session:
        now = datetime.now().timestamp()
        # 如果当前时间超过过期时间,清空session并跳回登录页
        if now > session['expires_at']:
            session.clear()
            return redirect(url_for('saml-login'))
        # 可选:用户活跃时自动延长超时时间(比如每次操作后刷新60分钟)
        session['expires_at'] = (datetime.now() + timedelta(minutes=60)).timestamp()
    # 没有用户信息的话直接跳登录
    elif 'user_info' not in session:
        return redirect(url_for('saml-login'))

方案原理

  • 浏览器关闭即终止会话:因为没开session.permanent = True,Flask默认发送的是临时会话cookie,浏览器关闭时会自动删除这个cookie,session自然就失效了。
  • 60分钟自动超时:通过存在session里的过期时间戳,每次请求都验证是否超时,一旦超时就清空session,强制用户重新登录。
  • 全程不需要前端JS参与,纯后端逻辑搞定,完全符合你的要求。

内容的提问来源于stack exchange,提问作者chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:40:26