62

我正在构建一个表单,我必须将数据存储在sessionStorage我不知道何时sessionStorage到期的 HTML5 中。谁能告诉我这个的过期时间sessionStorage

4

4 回答 4

88

它与您的浏览器会话有关,并且不会在选项卡之间共享。它不会自动过期。因此,如果您从不关闭浏览器,它就永远不会过期。

因此,当标签/窗口关闭时,数据丢失。

每个会话存储区域允许 5MB 的存储空间(在某些浏览器中为 10MB)。而cookie只允许 4kb(在某些浏览器中或更多)。然而,Cookie 有一个设定的到期日期。

正如Christophe在评论中所写,localstorage永不过期。它还可以跨选项卡共享,并且与会话存储 (5MB) 大小相同。

于 2013-03-02T06:56:48.633 回答
30

我知道这个问题已经很老了,但如果其他人偶然发现这个问题并觉得它有帮助,我会发布我的答案。您几乎可以使用以下方式模拟sessionStoragelocaStorage过期:

//In your login logic or whatever
var expires = new Date(year, month, day, hours, minutes, seconds, milliseconds);
var sessionObject = {
    expiresAt: expires,
    someOtherSessionData: {
        username: ''
    }
}
sessionStorage.setItem('sessionObject', JSON.stringify(sessionObject));

如果您不希望此会话对象清晰可见,您也可以使用类似http://bitwiseshiftleft.github.io/sjcl/的方式加密此对象。

在每次页面加载时,您都可以检查sessionStoragelocalStorage就此而言是否已过期:

$(document).ready(function(){
    var currentDate = new Date();
    var sessionObject = JSON.parse(sessionStorage.getItem('sessionObject'));
    var expirationDate = sessionObject.expiresAt;
    if(Date.parse(currentDate) < Date.parse(expirationDate)) {
        //normal application behaviour => session is not expired
        var someAppVariable = sessionObject.someOtherSessionData.etc;
    } else {
        //redirect users to login page or whatever logic you have in your app 
        //and remove the sessionStorage because it will be set again by previous logic
        sessionStorage.removeItem('sessionObject');
        console.log('session expired');
    }
});

如果您不希望用户在选项卡或浏览器关闭后保持登录状态,请使用sessionStorage,否则您应该根据需要使用localStorage和操作它。

我希望有人会觉得这很有帮助。

于 2017-01-03T12:16:30.990 回答
17

您可以添加某种过期机制,如下所示:

// get from session (if the value expired it is destroyed)
function sessionGet(key) {
  let stringValue = window.sessionStorage.getItem(key)
    if (stringValue !== null) {
      let value = JSON.parse(stringValue)
        let expirationDate = new Date(value.expirationDate)
        if (expirationDate > new Date()) {
          return value.value
        } else {
          window.sessionStorage.removeItem(key)
        }
    }
    return null
}

// add into session
function sessionSet(key, value, expirationInMin = 10) {
  let expirationDate = new Date(new Date().getTime() + (60000 * expirationInMin))
    let newValue = {
    value: value,
    expirationDate: expirationDate.toISOString()
  }
  window.sessionStorage.setItem(key, JSON.stringify(newValue))
}
于 2018-01-10T10:02:30.950 回答
1

您可以在 cookie 中保存过期时间。在每个页面加载读取cookie,如果它是空的(意味着过期)然后清除会话存储。

于 2018-11-02T10:26:06.740 回答