【发布时间】:2020-07-18 19:00:06
【问题描述】:
我正在使用 Vapor 4 开发一个 Web 应用程序。在请求之间将客户端生成的数据一次保存在服务器端几分钟会很有用。我想使用会话来做到这一点。但是,我对如何在设定的时间后自动销毁这些数据的最佳方法感到有些困惑。我应该做一份工作并定期检查吗?或者有没有一种简单的方法来设置会话创建的到期时间?
【问题讨论】:
-
你可以创建一个额外的中间件来检查会话是否仍然有效。
我正在使用 Vapor 4 开发一个 Web 应用程序。在请求之间将客户端生成的数据一次保存在服务器端几分钟会很有用。我想使用会话来做到这一点。但是,我对如何在设定的时间后自动销毁这些数据的最佳方法感到有些困惑。我应该做一份工作并定期检查吗?或者有没有一种简单的方法来设置会话创建的到期时间?
【问题讨论】:
我用了几个月的Middleware 来实现这个,非常可靠。
它将现在的时间戳与前一个请求的值进行比较。如果差值大于允许的会话超时,则会强制注销。
我不得不考虑初始化时间戳,"BAD" 确保 nil 从尝试初始化 Double 中返回,然后获取当前时间戳以启动会话“计时器”。我认为这是安全的,因为用户必须事先至少拨打一次路由电话才能登录,而且我还有其他 Middleware 可以检查以确保用户已登录。试试这个:
struct SessionTimeoutMiddleware:Middleware
{
func respond(to request:Request, chainingTo next:Responder) -> EventLoopFuture<Response>
{
let lastRequestTimeStamp = Double(request.session.data["lastRequest"] ?? "BAD") ?? Date().timeIntervalSince1970
request.session.data["lastRequest"] = String(Date().timeIntervalSince1970)
if Date().timeIntervalSince1970 - lastRequestTimeStamp > 300.0 // seconds
{
request.auth.logout(User.self)
return request.eventLoop.makeSucceededFuture(request.redirect(to:"/somewhere/safe"))
}
return next.respond(to:request)
}
}
然后,在configure.swift 注册使用:
let userAuthSessionsMW = User.authenticator()
let sessionTimeoutMW = SessionTimeoutMiddleware()
let timed = app.grouped(C.URI.Users).grouped(userAuthSessionsMW, sessionTimeoutMW)
try SecureRoutes(timed)
【讨论】: