1# 管理Cookie及数据存储 2<!--Kit: ArkWeb--> 3<!--Subsystem: Web--> 4<!--Owner: @aohui--> 5<!--Designer: @yaomingliu--> 6<!--Tester: @ghiker--> 7<!--Adviser: @HelloCrease--> 8 9Cookie是服务端发送客户端的数据。客户端持有Cookie,便于服务端快速识别身份和状态。 10 11当Cookie的SameSite属性未指定时,默认值为SameSite=Lax。这种设置下,Cookie仅在用户导航到其源站点时发送,不会在跨站请求中发送。 12 13## Cookie管理 14 15Web组件提供[WebCookieManager](../reference/apis-arkweb/arkts-apis-webview-WebCookieManager.md)类来管理Cookie信息。Cookie信息存储在应用沙箱路径下/proc/{pid}/root/data/storage/el2/base/cache/web/Cookies的文件中。 16 17下面以[configCookieSync()](../reference/apis-arkweb/arkts-apis-webview-WebCookieManager.md#configcookiesync11)接口为例,为“www\.example.com”设置单个Cookie的值“value=test”。其他Cookie的相关功能及使用,请参考[WebCookieManager()](../reference/apis-arkweb/arkts-apis-webview-WebCookieManager.md)接口文档。 18 19 20```ts 21// xxx.ets 22import { webview } from '@kit.ArkWeb'; 23import { BusinessError } from '@kit.BasicServicesKit'; 24 25@Entry 26@Component 27struct WebComponent { 28 controller: webview.WebviewController = new webview.WebviewController(); 29 30 build() { 31 Column() { 32 Button('configCookieSync') 33 .onClick(() => { 34 try { 35 webview.WebCookieManager.configCookieSync('https://www.example.com', 'value=test'); 36 } catch (error) { 37 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 38 } 39 }) 40 Web({ src: 'www.example.com', controller: this.controller }) 41 } 42 } 43} 44``` 45 46> **说明:** 47> 48> Cookie每30s周期性保存到磁盘中,也可以使用接口[saveCookieAsync](../reference/apis-arkweb/arkts-apis-webview-WebCookieManager.md#savecookieasync)进行强制落盘(PC/2in1和Tablet设备不会持久化session cookie,即使调用saveCookieAsync,也不会将session cookie写入磁盘)。 49 50## 缓存与存储管理 51 52在访问网站时,网络资源请求通常需要较长的时间。开发者可以通过Cache和Dom Storage等手段将资源保存到本地,以提高访问同一网站的速度。 53 54 55### Cache 56 57使用[cacheMode()](../reference/apis-arkweb/arkts-basic-components-web-attributes.md#cachemode)配置页面资源的缓存模式,Web组件为开发者提供四种缓存模式,分别为: 58 59- Default:优先使用未过期的缓存。如果缓存不存在,则从网络获取。 60 61- None:加载资源使用缓存。如果缓存中无该资源,则从网络中获取。 62 63- Online:加载资源不使用缓存。全部从网络中获取。 64 65- Only:只从缓存中加载资源。 66 67 68在下面的示例中,缓存设置为None模式。 69 70 71 72```ts 73// xxx.ets 74import { webview } from '@kit.ArkWeb'; 75 76@Entry 77@Component 78struct WebComponent { 79 @State mode: CacheMode = CacheMode.None; 80 controller: webview.WebviewController = new webview.WebviewController(); 81 82 build() { 83 Column() { 84 Web({ src: 'www.example.com', controller: this.controller }) 85 .cacheMode(this.mode) 86 } 87 } 88} 89``` 90 91 92为了获取最新资源,开发者可以通过[removeCache()](../reference/apis-arkweb/arkts-apis-webview-WebviewController.md#removecache)接口清除已经缓存的资源,示例代码如下: 93 94```ts 95// xxx.ets 96import { webview } from '@kit.ArkWeb'; 97import { BusinessError } from '@kit.BasicServicesKit'; 98 99@Entry 100@Component 101struct WebComponent { 102 @State mode: CacheMode = CacheMode.None; 103 controller: webview.WebviewController = new webview.WebviewController(); 104 105 build() { 106 Column() { 107 Button('removeCache') 108 .onClick(() => { 109 try { 110 // 设置为true时同时清除rom和ram中的缓存,设置为false时只清除ram中的缓存 111 this.controller.removeCache(true); 112 } catch (error) { 113 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 114 } 115 }) 116 Web({ src: 'www.example.com', controller: this.controller }) 117 .cacheMode(this.mode) 118 } 119 } 120} 121``` 122 123 124### Dom Storage 125 126Dom Storage包含了Session Storage和Local Storage两类。Session Storage为临时数据,其存储与释放跟随会话生命周期;Local Storage为持久化数据,保存在应用目录下。两者的数据均通过Key-Value的形式存储,在访问需要客户端存储的页面时使用。开发者可以通过Web组件的属性接口[domStorageAccess()](../reference/apis-arkweb/arkts-basic-components-web-attributes.md#domstorageaccess)进行使能配置,示例如下: 127 128 129 130```ts 131// xxx.ets 132import { webview } from '@kit.ArkWeb'; 133 134@Entry 135@Component 136struct WebComponent { 137 controller: webview.WebviewController = new webview.WebviewController(); 138 139 build() { 140 Column() { 141 Web({ src: 'www.example.com', controller: this.controller }) 142 .domStorageAccess(true) 143 } 144 } 145} 146``` 147