在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言作为Web开发人员,在 Web浏览器中存储数据以改善用户体验和提升Web应用程序性能是非常常见的。在大多数情况下,可供我们使用就是LocalStorage和SessionStorage。 本文中,我们将会从安全性和用户体验两个方面对SessionStorage和LocalStorage进行评估。然后我们将讨论如何根据您的要求挑选合适使用的对象。 SessionStorage和LocalStorage简介在HTML5之前,开发人员一般是通过使用Cookie在客户端保存一些简单的信息的。在HTML5发布后,提供了一种新的客户端本地保存数据的方法,那就是Web Storage,它也被分为:LocalStorage和SessionStorage,它允许通过JavaScript在Web浏览器中以键值对的形式保存数据。而相比Cookie有如下优点:
如何使用SessionStorage和LocalStorage您可以使用浏览器window对象访问SessionStorage和LocalStorage。请看下面的示例: sessionStorage = window.sessionStorage localStorage = window.localStorage 以下是这两种存储类型可用的功能。 //存储一个item storage.setItem('name', 'Alice') storage.setItem('age', '5') //读取一个item storage.getItem('name') // returns "Alice" //get存储对象长度 storage.length // returns 2 //通过索引get对应的key名 storage.key(0) // returns "name" //移除一个item storage.removeItem('name') //清空存储对象 storage.clear() LocalStorage与SessionStorage的区别LocalStorage和SessionStorage之间的主要区别在于浏览器窗口和选项卡之间的数据共享方式不同。 LocalStorage可跨浏览器窗口和选项卡间共享。就是说如果在多个选项卡和窗口中打开了一个应用程序,而一旦在其中一个选项卡或窗口中更新了LocalStorage,则在所有其他选项卡和窗口中都会看到更新后的LocalStorage数据。 但是,SessionStorage数据独立于其他选项卡和窗口。如果同时打开了两个选项卡,其中一个更新了SessionStorage,则在其他选项卡和窗口中不会反映出来。举个例子:假设用户想要通过两个浏览器选项卡预订两个酒店房间。由于这是单独的会话数据,因此使用SessionStorage是酒店预订应用程序的理想选择。 安全性说明Web Storage的存储对象是独立于域名的,也就是说不同站点下的Web应用有着自己独立的存储对象,互相间是无法访问的,在这一点上SessionStorage和LocalStorage是相同的。 举个例子:部署在abc.com上的Web应用无法访问xyz.com的Web Storage存储对象。 同样,对于子域名也是一样,尽管www.grapecity.com.cn和gcdn.grapecity.com.cn 同属 grapecity.com.cn 主域下,但它们相互不能访问对方的存储对象。 另外,不仅对子域名相互独立,对于针对使用http和https协议间也是不同的,所以这一点也需要注意。 应对跨站点脚本攻击(XSS)首先,什么是XSS攻击? XSS是将一段恶意脚本添加到网页上,通过浏览器加载而执行从而达到攻击并获得隐私信息的目的。 LocalStorage和SessionStorage在这一点上都容易受到XSS攻击。攻击者可直接向存储对象添加恶意脚本并执行。因此不太建议把一些敏感的个人信息存储在Web Storage中,例如:
如何避免攻击?
对用户体验的提升虽然一些敏感数据要避免使用,但我们依然可以通过WebStorage改善Web应用程序的用户体验 例如,用户在填写表单,但因为一些原因用户关闭了选项卡/窗口,但表单LocalStorage实现了自动保存用户表单的功能,这样当用户再次打开,用户之前填写的信息会自动被恢复。 <!DOCTYPE html> <html> <body> <h2>表单示例</h2> <form> <label for="lname">姓氏:</label><br> <input type="text" id="lname" name="lname" value="" onchange="save(this)"> <label for="fname">名字:</label><br> <input type="text" id="fname" name="fname" value="getValue(this)" onchange="save(this)"><br> </form> <script> localStorage= window.localStorage function save(input) { localStorage.setItem(input.id, input.value) } document.getElementById("fname").value=localStorage.getItem("fname") document.getElementById("lname").value=localStorage.getItem("lname") </script> </body> </html> 因为我们的场景是待用户再次打开时,自动恢复之前填写的内容,所以这里不能使用SessionStorage作为存储对象,因为它会在窗口关闭时自动清除。 使用存储对象进行浏览器缓存一般情况下,我们可以缓存一些应用数据,以便后面供Web应用使用。例如,你的Web应用需要加载所有国家的货币数据,在不使用WebStorage情况下,每次加载获取列表时都需要发出HTTP请求来获取,而将数据保存在LocalStorage后,可直接获取数据。 由于LocalStorage不会过期的特性,用户在任何使用打开页面时都可以使用存储对象中的内容,而如果用户想删除LocalStorage数据也很简单,清除浏览器缓存内容即可。 监听LocalStorage变化LocalStorage是一个可以用作本地持久化存储的对象,我们可以向其中添加数据存储,同样它在用户操作的情况下发生变化时,我们也需要能监听到,当它发生变化时,会触发storage事件,我们可以在window上监听到这个事件,从而完成一些逻辑操作。 window.addEventListener('storage', () => { ... }); window.onstorage = () => { ... }; 总结与结论您可以根据您的使用情况选择LocalStorage与SessionStorage。如果您的应用程序需要在多个浏览器窗口和标签页中共享数据,请使用LocalStorage,否则请使用SessionStorage。 SessionStorage和LocalStorage都容易受到XSS攻击。因此,请避免将敏感数据存储在浏览器存储中。 最后,虽然WebStorage很好用,还是建议你在如下的情况下使用:
以上就是Javascript怎样使用SessionStorage和LocalStorage的详细内容,更多关于Javascript的资料请关注极客世界其它相关文章! |
请发表评论