使用 Mozilla 附加组件计算仅 HTTP cookie
Count HTTP only cookies with Mozilla add-on
我正在尝试开发 Firefox 附加组件。我想计算标记为仅 HTTP 的 cookie。手动检查时,我看到许多网站都有不止一个 HTTP only cookie。但是,我的结果总是 0
或 1
。我的错在哪里?
这是我的代码:
var {Cc, Ci, Cu} = require("chrome");
Cu.import("resource://gre/modules/Services.jsm");
var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2);
var tabs = require("sdk/tabs");
tabs.on('load', function(tab) {
var URL = tab.url;
var url = require("sdk/url").URL(URL);
var host = url.host;
function getCookies(host){
var cookies = cookieManager.getCookiesFromHost(host);
var count = 0;
while (cookies.hasMoreElements()){
var cookie = cookies.getNext().QueryInterface(Ci.nsICookie2);
//var count = 0;
var httpCookie = cookie.isHttpOnly;
if(httpCookie){
return count=count+1 ;
}else{
return 0;
}
console.log("Cookie host: " + cookie.host + "; Cookie Name :" + cookie.name
+ " = Cookie value:" + cookie.value + "\n");
dump("\tCookie host: " + cookie.host + " Is Domain cookie: " +cookie.isDomain
+ "; Cookie Name :" + cookie.name +" = Cookie value:" + cookie.value
+ "; Is Session Cookie :" + cookie.isSession
+ "; Expiry time :" + cookie.expiry
+ "; It is an Http only cookie :" + cookie.isHttpOnly + "\n");
}
return count;
}
var getResult = getCookies(host);
console.log("Http Cookies: " + getResult);
});
在您的 function getCookies(host)
中,您有一个 while
循环,旨在遍历指定 host
的所有 cookie。但是,该循环的内部只执行一次。
在该循环中,您有一个 if
语句:
var httpCookie = cookie.isHttpOnly;
if(httpCookie){
return count=count+1 ;
}else{
return 0;
}
此语句导致函数立即返回 1
或 0
,具体取决于找到的第一个 cookie 是否具有 属性 cookie.isHttpOnly
作为 true
或 false
。 [注意:cookie
总是 0
当这个 if
语句第一次也是唯一一次执行时。] 除了第一个 cookie 之外,没有其他 cookie 被检查,因为你立即 return
价值。您的函数的执行在此 if
语句中的两个 return
语句中的任何一个结束。 if
之后函数内的行将不会执行。
根据您的描述,您的 if
陈述会更好:
if(cookie.isHttpOnly){
count++;
}
注意:鉴于您只使用了一次 cookie.isHttpOnly
,因此无需将其分配给单独的变量。
我正在尝试开发 Firefox 附加组件。我想计算标记为仅 HTTP 的 cookie。手动检查时,我看到许多网站都有不止一个 HTTP only cookie。但是,我的结果总是 0
或 1
。我的错在哪里?
这是我的代码:
var {Cc, Ci, Cu} = require("chrome");
Cu.import("resource://gre/modules/Services.jsm");
var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2);
var tabs = require("sdk/tabs");
tabs.on('load', function(tab) {
var URL = tab.url;
var url = require("sdk/url").URL(URL);
var host = url.host;
function getCookies(host){
var cookies = cookieManager.getCookiesFromHost(host);
var count = 0;
while (cookies.hasMoreElements()){
var cookie = cookies.getNext().QueryInterface(Ci.nsICookie2);
//var count = 0;
var httpCookie = cookie.isHttpOnly;
if(httpCookie){
return count=count+1 ;
}else{
return 0;
}
console.log("Cookie host: " + cookie.host + "; Cookie Name :" + cookie.name
+ " = Cookie value:" + cookie.value + "\n");
dump("\tCookie host: " + cookie.host + " Is Domain cookie: " +cookie.isDomain
+ "; Cookie Name :" + cookie.name +" = Cookie value:" + cookie.value
+ "; Is Session Cookie :" + cookie.isSession
+ "; Expiry time :" + cookie.expiry
+ "; It is an Http only cookie :" + cookie.isHttpOnly + "\n");
}
return count;
}
var getResult = getCookies(host);
console.log("Http Cookies: " + getResult);
});
在您的 function getCookies(host)
中,您有一个 while
循环,旨在遍历指定 host
的所有 cookie。但是,该循环的内部只执行一次。
在该循环中,您有一个 if
语句:
var httpCookie = cookie.isHttpOnly;
if(httpCookie){
return count=count+1 ;
}else{
return 0;
}
此语句导致函数立即返回 1
或 0
,具体取决于找到的第一个 cookie 是否具有 属性 cookie.isHttpOnly
作为 true
或 false
。 [注意:cookie
总是 0
当这个 if
语句第一次也是唯一一次执行时。] 除了第一个 cookie 之外,没有其他 cookie 被检查,因为你立即 return
价值。您的函数的执行在此 if
语句中的两个 return
语句中的任何一个结束。 if
之后函数内的行将不会执行。
根据您的描述,您的 if
陈述会更好:
if(cookie.isHttpOnly){
count++;
}
注意:鉴于您只使用了一次 cookie.isHttpOnly
,因此无需将其分配给单独的变量。