我必须对这种情况进行编码:
有些用户来填写表单,当用户在其中时,会话到期; 用户尝试提交表单,因为会话已过期,他将进入登录页面,之后他将被重新编辑为具有预先填写表格的页面,其中包含之前填写的数据。
我提出的解决方案: 在表单提交上,检查用户会话是否通过ajax调用过期,如果是,则删除填充表单值的cookie,用户返回相同的表单,从cookie值预填表单。
我走了多远: 不多;我使用ajax调用来检查会话到期时间后调用此函数:
def check_valid_session(request):
session_expiry_date = request.session.get_expiry_date()
now = datetime.now()
seconds_left = (session_expiry_date - now).total_seconds()
if seconds_left <= 0:
return JsonResponse({'session_expired': True, 'seconds_left': seconds_left })
else:
return JsonResponse({'session_expired':False, 'seconds_left': seconds_left})
在我的设置中我有:
SESSION_COOKIE_NAME = "sso-sessionid"
SESSION_COOKIE_HTTPONLY = False
SESSION_COOKIE_AGE = 10
SESSION_COOKIE_DOMAIN = '.mydomain.com'
SESSION_COOKIE_SECURE = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
但作为回应,我总是得到seconds_left接近9.999。 每次我点击提交并调用上面的后端代码时,session_expiry_date会自动增加10秒。 如何获得正确的会话到期时间?任何替代方法?
答案 0 :(得分:1)
所以这里发生的事情是对check_valid_session视图的连续请求会将cookie的年龄从最后一个请求刷新到10秒。只有在自上一次请求后10秒内,cookie才会过期。
因为你必须要求获得cookie到期,所以每次都会返回接近10的值。
如果会话已过期,则使用cookie保存用户数据的问题。如果没有会话数据,您如何知道用户正在发出请求?我能想到的唯一能做的就是以某种方式保存他们的帖子数据及其相关的IP地址。虽然这肯定会使问题复杂化,但从安全角度来看并不好,因为如果他们使用相同的ip发出请求,其他用户可能会看到这些帖子数据。
最简单的解决方案是增加会话的超时时间。 10秒非常短,SESSION_COOKIE_AGE的默认值是1209600(2周,以秒为单位)
答案 1 :(得分:0)
您可以尝试设置
SESSION_SAVE_EVERY_REQUEST = True
每次请求都会将会话保存到数据库中。此外,每次请求都会发送cookie。