Google Chrome瀏覽器擴展可以使用如下任何一種存儲機制:
- HTML5的localStorage API實現的本地存儲(此處略)
- Google的chrome.storage.* API實現的瀏覽器存儲
- Google的chrome.cookies.* API實現的cookie存儲
1) chrome.storage API實現的瀏覽器存儲
Chrome瀏覽器擴展通過chrome.storage.* API,可以存取數據或監聽數據的變化。
在manifest.json文件中注冊storage如下:
{
"permissions": [
"storage"
],
}
chrome.storage.* API提供了chrome.storage.sync, chrome.storage.local和chrome.storage.managed三種存儲空間類型。chrome.storage.local方式只能夠將數據存儲在當前登錄的設備本地。
chrome.storage.sync方式實現了自動數據同步,相同的用戶無論使用什么物理設備,只要以相同的賬戶登錄即可訪問存儲的數據。設備離線時數據存儲在本地,一旦設備上線則同步數據。如果用戶禁止了數據同步,則采用chrome.storage.local方式。
chrome.storage.managed方式是只讀存儲,只有域管理員能夠在其中存儲數據,Chrome瀏覽器擴展只能讀取其中的數據。
chrome.storage機制采用一系列的存儲格子(tubes)存儲數據,存儲空間有限。存儲數據時只能一個一進行寫入操作,並發性能不高。
下面以chrome.storage.sync為例介紹具體方法的使用:
- 存儲一個或多個數據
chrome.storage.sync.set(object items, function() {...})
其中的items對象包含若干“鍵值對”的映射,一個鍵值對就是一個存儲的數據項。
- 獲取指定key的數據項
chrome.storage.sync.get(string or array of string or object keys, function(object items) {...})
其中的keys如果為null則返回全部存儲的數據項,如果為””或[]將返回空對象{}。
回調函數中的items對象就是獲取的數據項,其中包含“鍵值對”的映射。
- 刪除指定key的一個或多個數據項
chrome.storage.sync.remove(string or array of string keys, function() {...})
- 清空存儲的所有數據項
chrome.storage.sync.clear(function(){…})
- 獲取當前已經被使用的存儲空間的數量(以字節為單位)
chrome.storage.sync.getBytesInUse(string or array of string keys, function(integer bytesInUse) {...})
其中的keys屬性是數據項的key,如果為null表示取全部數據項的使用空間,””或[]將返回0
此外,對於某些敏感數據的變化,可以通過onChanged事件進行監聽。存儲格子中的任何變化都將觸發該事件,示例如下:
chrome.storage.onChanged.addListener(function(changes, namespace) {
for (key in changes) {
var storageChange = changes[key];
console.log('Storage key "%s" in namespace "%s" changed. ' +
'Old value was "%s", new value is "%s".',
key, //數據的索引key
namespace, //數據的存儲空間類型,枚舉值"sync", "local", "managed"
storageChange.oldValue,//變化前的值
storageChange.newValue); //變化后的值
}
});
回調函數中的changes對象包含了所有發生變化了的數據的key(string類型)和變化前后的值(StoreageChange類型),數據結構如下:
changes:{
key1: obj
key2: obj2
…
keyn: objn
}
2) chrome.cookies.* API實現的cookie存儲
Chrome瀏覽器擴展通過chrome.cookies.* API,可以獲取或修改cookie,還可以監控cookie的變化。
在manifest.json文件中聲明cookie權限以及要訪問的域如下:
{
"permissions": [
"cookies",
"*://*.google.com"
],
}
chrome.cookies.Cookie對象的屬性如下:
| 屬性名 |
類型 |
必選/可選 |
注釋 |
| name |
string |
必選 |
Cookie對象的名字 |
| value |
string |
必選 |
Cookie對象的值 |
| domain |
string |
必選 |
Cookie對象適用的域 |
| path |
string |
必選 |
Cookie對象適用的URL路徑 |
| hostOnly |
boolean |
必選 |
Cookie對象是否只響應指定主機的請求,訪問Cookie對象的請求的主機必須在指定范圍內 |
| secure |
boolean |
必選 |
Cookie對象是否被標記為Secure,這樣就只能通過安全通道(如HTTPS)訪問Cookie對象 |
| httpOnly |
boolean |
必選 |
Cookie對象是否被標記為HttpOnly,這樣客戶端腳本就無法訪問Cookie對象 |
| session |
boolean |
必選 |
是否為Session級別的Cookie對象 |
| expirationDate |
double |
可選 |
Cookie對象的過期時間,單位s Session級別的Cookie對象沒有該屬性,因為會話結束即過期 |
| storeId |
string |
必選 |
包含該Cookie對象的CookieStore的ID |
其中,chrome.cookies.CookieStore對象表示瀏覽器中的cookie倉庫,常見的有正常模式的CookieStore和隱身模式的CookieStore。
chrome.cookies API中的常用方法:
- 獲得一個Cookie對象,如果有多個符合過濾條件則返回擁有最長path的Cookie對象
chrome.cookies.get(object details, function(Cookie cookie) {...})
details對象的屬性如下:
| 屬性名 |
類型 |
必選/可選 |
注釋 |
| url |
string |
必選 |
訪問Cookie對象的請求的URL |
| name |
string |
必選 |
Cookie對象的名字 |
| storeId |
string |
可選 |
包含該Cookie對象的CookieStore的ID,默認為當前執行的上下文的CookieStore |
- 獲取一個CookieStore中的所有的Cookie對象
chrome.cookies.getAll(object details, function(array of Cookie cookies) {...})
details對象的屬性如下:
| 屬性名 |
類型 |
必選/可選 |
注釋 |
| url |
string |
可選 |
訪問Cookie對象的請求的URI,影響domain和path |
| name |
string |
可選 |
Cookie對象的名字 |
| value |
string |
可選 |
Cookie對象的值 |
| domain |
string |
可選 |
Cookie對象適用的域 |
| path |
string |
可選 |
Cookie對象適用的URL路徑 |
| secure |
boolean |
可選 |
Cookie對象是否被標記為Secure,這樣就只能通過安全通道(如HTTPS)訪問Cookie對象 |
| session |
boolean |
可選 |
是否為Session級別的Cookie對象 |
| storeId |
string |
可選 |
包含該Cookie對象的CookieStore的ID |
- 設置Cookie對象
chrome.cookies.set(object details, function(Cookie cookie) {...})
details對象的屬性如下:
| 屬性名 |
類型 |
必選/可選 |
注釋 |
| url |
string |
必選 |
訪問Cookie對象的請求的URI,影響domain和path |
| name |
string |
可選 |
Cookie對象的名字 |
| value |
string |
可選 |
Cookie對象的值 |
| domain |
string |
可選 |
Cookie對象適用的域 |
| path |
string |
可選 |
Cookie對象適用的URL路徑 |
| secure |
boolean |
可選 |
Cookie對象是否被標記為Secure,這樣就只能通過安全通道(如HTTPS)訪問Cookie對象 |
| httpOnly |
boolean |
可選 |
Cookie對象是否被標記為HttpOnly,這樣客戶端腳本就無法訪問Cookie對象 |
| expirationDate |
double |
可選 |
Cookie對象的過期時間,單位s Session級別的Cookie對象沒有該屬性,因為會話結束即過期 |
| storeId |
string |
可選 |
包含該Cookie對象的CookieStore的ID |
- 根據名字刪除Cookie對象
chrome.cookies.remove(object details, function(object details) {...})
details對象的屬性如下:
| 屬性名 |
類型 |
注釋 |
| url |
string |
要刪除的Cookie對象所關聯的URL |
| name |
string |
要刪除的Cookie對象的名字 |
| storeId |
string |
要刪除的Cookie對象的CookieStore的ID |
- 獲取所有的cookie倉庫對象
chrome.cookies.getAllCookieStores(function(array of CookieStore cookieStores) {...})
- 監聽Cookie對象的變化
chrome.cookies.onChanged.addListener(function(object changeInfo) {...})
如果Cookie對象的值被修改或刪除,則發出該事件。changeInfo對象的屬性如下:
| 屬性名 |
類型 |
注釋 |
| removed |
boolean |
Cookie對象是否被刪除 |
| cookie |
chrome.cookies.Cookie |
發生變化的Cookie對象 |
| cause |
chrome.cookies.OnChangedCause |
導致Cookie對象變化的原因 |
