【问题标题】:Why is session storage being drawn upon between different browser instances?为什么在不同的浏览器实例之间使用会话存储?
【发布时间】:2018-02-23 00:40:04
【问题描述】:

背景
在我正在开发的应用程序中,我发现我可以在 Windows 10 上的 Chrome 62 中定义 sessionStorage 中的值,并且显然在一个选项卡中更改该值会影响指向同一键的其他选项卡。

我的操作假设是 localStorage 应该在所有浏览器窗口中保留信息,而 sessionStorage 应该只保留特定窗口或选项卡的信息。

更具体地说,我有一个 AngularJS 服务用作sessionStorage 交互的层:

export class PersistenceSvc {
    public static $inject: string[] = ['$window'];
    public constructor(public $window: ng.IWindowService) {}

    public save<T>(name: string, data: T): void {
        const saveData: string = JSON.stringify(data);
        this.$window.sessionStorage.setItem(name, saveData);
    }

    public load<T>(name: string): T {
        const loadData: string = this.$window.sessionStorage.getItem(name);
        const result: T = JSON.parse(loadData) as T;
        return result;
    }
}

...我从 run 块中使用它,以便在我的应用程序中实现一些数据持久性。

export function persistSomeData(
    someSvc: Services.SomeService, 
    userAgentSvc: Services.UserAgentSvc,
    persistenceSvc: Services.PersistenceSvc,
    $window: ng.IWindowService) {
    if(userAgentSvc.isMobileSafari()) {
        // Special instructions for iOS devices.
        return;
    }

    const dataToPersist: Models.DataModel = persistenceSvc.load<Models.DataModel>('SomeData');
    if(dataToPersist) {
        // Set up the state of someSvc with the data loaded.
    } else {
        // Phone home to the server to get the data needed.
    }

    $window.onbeforeunload = () => {
        persistenceSvc.save<Models.DataModel>('SomeData', someSvc.dataState);
    };
}

persistSomeData.$inject = [
    // All requisite module names, omitted from example because lazy.
];
angular
    .module('app')
    .run(persistSomeData);

仅使用单个选项卡进行操作时,它可以正常工作(除非从 iOS 设备运行,但这与我遇到的情况无关。)但是,当您执行以下操作时,您会开始看到一些更有趣的行为......

步骤:
1. 打开一个 Chrome 实例。创建一个新选项卡,然后将其拖出,使其成为自己的窗口。
2. 使用上述代码导航到您的网站。
3. 在您的网站上做一些事情,导致someSvc 的数据状态在第一个浏览器中具有不同的数据。
4. 在您​​的网站上做一些事情,导致someSvc 的数据状态在第二个浏览器中具有不同的数据。
5. 在您的网站上做一些事情,利用someSvc 在第一个浏览器中的数据状态。
6. 观察在第一个浏览器实例上使用的数据来自第二个浏览器实例。 (这就是问题所在。)

问题:
过去我没有做过很多 cookie/localStorage/sessionStorage 编程,所以我很可能误解了一些东西。 考虑到这一点,为什么 window.sessionStorage 的行为方式与 the MDN documentationthe winning answer to this SO question 所说的行为方式不一样?

编辑:原来有问题,但不是客户端。结束这个问题,因为我在假设客户是问题的情况下进行操作。

【问题讨论】:

    标签: angularjs google-chrome typescript persistence session-cookies


    【解决方案1】:

    您的代码有问题,因为在浏览器控制台上进行的快速简单的测试表明 sessionStorage 仅影响打开的浏览器选项卡。右侧选项卡中的更改不会反映到左侧选项卡:

    【讨论】:

    • 看了我的代码,确实有问题,但不是客户端,是服务器端。你说得对,sessionStorage 工作正常。我要结束这个问题,因为我的假设是错误的。
    • 我转录的 persistenceSvc.load 函数中还有一个错字:我没有返回 result。这在原始帖子中也已修复。
    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2019-01-17
    • 2016-08-27
    • 2021-01-15
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多