Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular2在浏览器刷新后保留敏感信息_Angular_Local Storage_Session Storage - Fatal编程技术网

Angular2在浏览器刷新后保留敏感信息

Angular2在浏览器刷新后保留敏感信息,angular,local-storage,session-storage,Angular,Local Storage,Session Storage,我的登录操作返回有关登录用户的信息(如果他们是管理员或非管理员),例如(isAdmin:true)我可以在组件之间保留此信息,直到浏览器刷新或类似操作。但我在浏览器刷新后丢失了这些信息。我不知道如何保留这个值 我正在使用localStorage和sessionStorage保存一些非敏感信息。但此信息是敏感信息,不应允许用户编辑/查看此值 使用angular2有什么方法可以做到这一点吗?你不能信任客户。如果用户是管理员,则可以创建一个返回布尔值的API服务,如果未设置isAdmin值,则可以检查

我的登录操作返回有关登录用户的信息(如果他们是管理员或非管理员),例如
(isAdmin:true)
我可以在组件之间保留此信息,直到浏览器刷新或类似操作。但我在浏览器刷新后丢失了这些信息。我不知道如何保留这个值

我正在使用
localStorage
sessionStorage
保存一些非敏感信息。但此信息是敏感信息,不应允许用户编辑/查看此值


使用angular2有什么方法可以做到这一点吗?

你不能信任客户。如果用户是管理员,则可以创建一个返回布尔值的API服务,如果未设置isAdmin值,则可以检查该服务

每次启动应用程序时,我都会对服务器或您拥有用户信息的位置进行API调用。因此,当我刷新应用程序时,我从第一手信息中获得信息,并且我不必将其存储在会话中,我只需将数据存储在对象中并使用它

当您登录时,生成一个令牌并将其保存在会话中,然后将其与我前面提到的API调用一起发送

这就是我的方法:

  • 登录->生成令牌
  • 存储令牌
  • 通过令牌获取用户信息的API调用(在App init上)

  • 希望它能帮助你,或者至少能给你一些有价值的想法。。。让我们知道您如何解决您的问题!:D

    会话存储
    本地存储
    应在

    虽然localStorage中存储的数据没有过期设置,但是 当页面会话结束时,in sessionStorage将被清除。一页 只要浏览器处于打开状态,会话将持续一段时间,并在浏览器结束后继续 页面重新加载和恢复

    您应该从API获取数据并将其存储在服务中,因为服务是单例的,这意味着它将在应用程序期间可用,并且不会持久化

    从'@angular/core'导入{Injectable};
    从'angular2/Http'导入{Http};
    从“rxjs/Observable”导入{Observable};
    @可注射()
    导出类存储服务{
    private _isAdmin=null;
    构造函数(私有http:http){}
    公共获取isAdmin(){
    //如果我们需要获取数据
    如果(_isAdmin==null){
    返回此.http.get('https://myapi.myserver.com')
    .map((response)=>response.json().isAdmin)
    .do(isAdmin:boolean){this.\u isAdmin=isAdmin);
    })
    可观察到的返回值(该值);
    }
    }
    

    如果需要存储更多的数据,您也可以使用或其他存储库,而不仅仅是这一位数据

    我在localStorage中保存了一个用户配置文件,并订阅了路由器事件。然后我记录了事件,并选择了我遇到问题的路由的开始事件。当事件发生时,我从localStorage重置了用户配置文件,该文件位于is验证我的AuthGuard检查。现在,每当我刷新时,我的数据仍在那里,并且我不会被踢出受保护的路由。

    你可以将此数据存储在服务中,因为服务是单例的,它应该持续应用程序运行的时间loaded@OferHerman是的。我会把它保存在一个可注射的服务中。但我已经看到它能持续多久wser refresh。我也面临同样的问题。您找到解决方案了吗,@PhilipJohn?@MaxBertoli请验证下面接受的答案。您可以在从API获取数据后将数据保存在组件中,并将其传递给组件的构造函数。一旦刷新浏览器,此组件应再次使用API调用刷新敏感数据。Thanks@PhilipJohn,我已经有了第1点和第2点,我在服务器端创建了一个isAdmin函数,但没有向它传递令牌。我会尝试,我希望它会刷新我的组件的ui。如果你使用警卫,你会在每次路由更改时调用此API吗?你需要将其存储在某个地方,但即使在浏览器刷新后,它是否仍会保留?我无法保留此信息由于这是敏感的,我将在本地存储或会话存储中使用此信息。我将在可注入服务中使用此信息,并为每个浏览器刷新调用API,如@Nick所说。我想这是解决我问题的最佳解决方案。无论如何,谢谢!刷新后它不会保留。您需要再次获取它。请参阅getter.True中的备注。这是最好的解决方案打开。但我会将信息保存在可注入服务中,直到信息丢失或浏览器刷新。每次加载组件时调用API都非常昂贵!@PhilipJohn No,我的好朋友!您只调用一次API。将该数据存储在对象中,然后与共享服务共享该数据。您只调用一次,但在所有App.Chec中使用信息k此
    共享服务
    用于在组件之间进行通信:@PhilipJohn on browser refresh通过共享服务共享的所有数据都将被清除。如何防止这种情况发生?@PhilipJohn您不能。或者您将数据保存在某个位置(会话存储、本地存储、cookie)或触发onInit()方法当组件初始化时,监听器会被触发,所有的数据都在那里。