【问题标题】:Angular crashing with cookies disabled禁用 cookie 的角度崩溃
【发布时间】:2016-03-09 00:49:32
【问题描述】:

我正在开发一个大型 Angular 应用程序,如果他们禁用了 cookie,我需要向用户显示错误消息。

因此,问题是:当 Angular 尝试加载一个尝试访问本地存储的模块时,当 cookie 被禁用并显示以下错误消息时,Angular 崩溃:

Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.

Angular 在这里抛出了错误:

function getService(serviceName, caller) {
  if (cache.hasOwnProperty(serviceName)) {
    if (cache[serviceName] === INSTANTIATING) {
      throw $injectorMinErr('cdep', 'Circular dependency found: {0}',
                serviceName + ' <- ' + path.join(' <- '));
    }
    return cache[serviceName];
  } else {
    try {
      path.unshift(serviceName);
      cache[serviceName] = INSTANTIATING;
      return cache[serviceName] = factory(serviceName, caller);
    } catch (err) {
      if (cache[serviceName] === INSTANTIATING) {
        delete cache[serviceName];
      }
      throw err; // THIS IS WHATS BEING THROWN
    } finally {
      path.shift();
    }
  }
}

此应用程序的许多组件以一种或另一种方式访问​​ localStorage,简单地将它们硬重定向到另一个页面以显示此错误似乎是不雅的。

还有其他人遇到过这个问题吗?

【问题讨论】:

    标签: javascript angularjs cookies


    【解决方案1】:

    我以前遇到过类似的事情。可悲的是,检查 localStorage 是否存在的唯一方法是尝试访问它,如果它不存在,则会引发异常。因此,您可以在 localStorage 上调用的任何地方添加异常处理。

    我不知道您直接访问 localStorage 的地方有多少,但也许创建一个服务来检查您需要的所有客户端功能可能会有所帮助。 所以你可以使用这样的函数

    function lsTest(){
        var test = 'test';
        try {
            localStorage.setItem(test, test);
            localStorage.removeItem(test);
            return true;
        } catch(e) {
            return false;
        }
    }
    
    if(lsTest() === true){
        // available
    }else{
        // unavailable
    }
    

    取自 check if localStorage is available

    将此粘贴​​到所有服务/控制器都可以访问的服务中,这些服务/控制器直接访问 localStorage 并跳过对 localStorage 的任何调用。这应该可以防止您在初始化时遇到异常。

    【讨论】:

      猜你喜欢
      • 2020-11-22
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多