Flask 的服务器端会话?

1 投票
1 回答
5060 浏览
提问于 2025-04-18 16:03

我在尝试Django的时候,对客户端的会话感到很惊讶。是什么阻止用户重放旧的值呢?现在我登出后,我的会话在一个月后还可能被重放。

我想为每个会话提供CSRF保护(特别是对于登录和登出)。此外,我希望能够在服务器端设置或取消会话,这样旧的会话cookie就不再有效。我还希望这能和消息闪烁的功能兼容。

有什么实现方式可以满足这三个需求呢?

1 个回答

8

Flask的会话有一个内置的过期时间,这个过期时间是通过加密方式来保证的。也就是说,一旦会话过期,客户端就不能再使用这个会话的值了。

你可以通过设置PERMANENT_SESSION_LIFETIME这个配置选项来调整会话的最大有效时间。默认情况下,这个时间是31天。

你可以把这个时间设置得更短;默认情况下,Flask会在每次请求时刷新cookie的时间戳,这意味着只要用户持续访问,cookie就会一直被刷新。如果你把PERMANENT_SESSION_LIFETIME设置为1小时,那么如果用户在一个小时内没有访问你的服务器,会话就会自动过期。

如果你感兴趣,会话数据是通过URLSafeTimedSerializer进行序列化和签名的,这个工具来自于itsdangerous项目

需要注意的是,登录信息可以有自己的超时时间;不要只是把用户名记录在会话中,还要记录下你最后一次看到这个用户的时间。会话数据是经过加密签名的,所以最终用户无法修改这个cookie。每次用户回来时,刷新一下时间戳。这样,你就可以让用户的登录过期时间和会话的过期时间相互独立。

撰写回答