如何实现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
相关产品推荐
相关产品推荐

