存储具有到期日期的会话数据

Store data for session with an expiration date

我正在 Angular(准确地说是 Ionic 5)中构建一个移动应用程序,我需要一种方法来在我的用户工作流程中保留会话数据。

我考虑过为此使用 sessionStorage,但重要的是我的用户会话应在 5 分钟后自动过期。所以我想存储数据并在用户完成工作流时重置这些数据,或者如果用户未在 5 分钟内完成工作流则重置它们。

最好的方法是什么?

将过期时间与数据一起存储在 sessionStorage 中,读取密钥时,检查时间以确保它仍然有效。

参考this article

这是一个例子:

setExpiryItem=function(n,v,e){
    sessionStorage.setItem(n,JSON.stringify({expiryDate:Date.now()+parseInt(e),value:v}));
}
getExpiryItem=function(n){
    var k=JSON.parse(sessionStorage.getItem(n));
    if(!k)return {msg:"Not set",expiryDate:undefined,val:undefined};
    if(Date.now()>k.expiryDate){/* sessionStorage.removeItem(n); You can remove it if you want */return {msg:"Expired",expiryDate:k.expiryDate,val:null};}
    return {msg:"Success",expiryDate:k.expiryDate,val:k.value};
}
document.getElementById("time").onkeydown=function(e){
    if(e.key=="Enter")document.getElementById("submit").click();
}
document.getElementById("submit").onclick=function(){
    setExpiryItem("key","This is 'key'!",document.getElementById("time").value);
}
document.getElementById("retrieve").onclick=function(){
    var r=getExpiryItem("key");
    if(r.msg=="Success")
        document.getElementById("value").textContent=r.val;
    else if(r.msg=="Not set")
        document.getElementById("value").innerHTML="<span style='color:red'>Please set key before retrieving it!</span>";
    else if(r.msg=="Expired")
        document.getElementById("value").innerHTML="<span style='color:red'>'key' has expired</span>";
}
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8"/>
        <title>Storage Timeout</title>
    </head>
    <body>
    <h3>This will not work on SO because it causes SecurityError</h3>
        <p>Enter the expire time for key in sessionStorage</p>
        <input type="number" id="time"/><button id="submit">Submit</button>
        <hr/>
        <button id="retrieve">Retrieve key</button>
        <p id="value"></p>
    </body>
</html>

您可以使用用户反应事件(点击、按键等)来刷新您的会话并进行任何您想要的控制!类似于 (click)="refreshSession()"。您的所有控件都将在 refreshSession()

内进行