有没有办法在Javascript的帮助下,列出与当前页面关联的所有cookie? 也就是说,如果我不知道cookie的名称但想检索它们所包含的所有信息。
有没有办法在Javascript的帮助下,列出与当前页面关联的所有cookie? 也就是说,如果我不知道cookie的名称但想检索它们所包含的所有信息。
您可以列出当前域的cookie:
function listCookies() {
var theCookies = document.cookie.split(';');
var aString = '';
for (var i = 1 ; i <= theCookies.length; i++) {
aString += i + ' ' + theCookies[i-1] + "\n";
}
return aString;
}
但出于安全原因,您无法列出其他域的 cookie
httpOnly
属性被设置为 true 时,这种方法无效。 - Risto NovikaString += i + ' ' + decodeURIComponent(theCookies[i-1]) + "\n";
可以获得更好的输出。 - Mark Rajcok实验规范(截至2023年4月,浏览器支持较差,请使用2022年的答案):
const cookies = await cookieStore.getAll()
// Then...
Object.fromEntries(cookies.map(({name, value}) => [name, value]))
// OR
cookies.reduce((cs, c) => ({...cs, [c.name]: c.value}), {})
点击此处阅读更多:https://developer.mozilla.org/zh-CN/docs/Web/API/CookieStore/getAll
简而言之 - 这是一行代码:
Object.fromEntries(document.cookie.split('; ').map(c => c.split('=')))
注意:你不能在浏览器代码中获取http-only
Cookie。
这里是同样的内容,解释说明:
const getCookieMap = () => {
// Cookies are generally separated by a "; "
// https://dev59.com/CG445IYBdhLWcg3wdqOO#4843598
const cookieList = document.cookie.split('; ');
// A key-value pair in the cookie list is separated by a "="
// We pass a function to cookieList.map that will return
// an array of tuples, like [key, value]
const cookieToObjEntry = cookie => cookie.split('=')
const cookieEntries = cookieList.map(cookieToObjEntry)
// Such an array can be passed to Object.fromEntries to
// obtain an object with all cookie key-value pairs as
// the keys and values of an object
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries
return Object.fromEntries(cookieEntries)
// So, for a cookies stored as "c1=v1; c2=v2", you'll get
// an object like `{c1: v1, c2: v2}`
}
许多人已经提到document.cookie
可以获取所有的cookie(除了http-only
的)。
我只是想添加一小段代码来跟上时代的步伐。
document.cookie.split(';').reduce((cookies, cookie) => {
const [ name, value ] = cookie.split('=').map(c => c.trim());
cookies[name] = value;
return cookies;
}, {});
document.cookie.split(';').reduce((cookies, cookie) => {
const [ name, value ] = cookie.split('=').map(c => c.trim());
return { ...cookies, [name]: value };
}, {});
编辑:有人正确指出,如果您的cookie键或值中有=
,则会遇到问题。也许考虑使用转义序列来减轻这个问题?
var x = document.cookie;
window.alert(x);
这将显示当前站点可以访问的所有 cookie。例如,如果您创建了两个 cookie "username=Frankenstein" 和 "username=Dracula",这两行代码将显示 "username=Frankenstein; username=Dracula"。但是,到期日期等信息不会显示。
httpOnly
设置cookie,那么此方法将不起作用。建议使用httpOnly
以减轻XSS攻击的负面影响。 - Flimm为了快速查看特定页面上的cookie,我会在收藏栏中保留一个名为"Cookie"的快捷方式,并将其URL设置为:
javascript:window.alert(document.cookie.split(';').join(';\r\n'));
编号。
浏览器提供的唯一用于处理Cookie 的 API 是通过键值对进行获取和设置。所有浏览器仅通过域名来处理 Cookie。
访问当前域中的所有Cookie 可以使用 document.cookie
。
function listCookies() {
let cookies = document.cookie.split(';')
cookies.map((cookie, n) => console.log(`${n}:`, decodeURIComponent(cookie)))
}
function findCookie(e) {
let cookies = document.cookie.split(';')
cookies.map((cookie, n) => cookie.includes(e) && console.log(decodeURIComponent(cookie), n))
}
这是专门为你所在的窗口而设计的。试图保持干净简洁。
我在https://electrictoolbox.com/javascript-get-all-cookies/上找到了这段代码,比其他解决方案更适合我:
function get_cookies_array() {
var cookies = { };
if (document.cookie && document.cookie != '') {
var split = document.cookie.split(';');
for (var i = 0; i < split.length; i++) {
var name_value = split[i].split("=");
name_value[0] = name_value[0].replace(/^ /, '');
cookies[decodeURIComponent(name_value[0])] = decodeURIComponent(name_value[1]);
}
}
return cookies;
}
=
。因此,简单地按=
拆分会导致不规则的结果,并且先前的答案会随时间(或根据使用深度立即)而崩溃。// Returns an object of key value pairs for this page's cookies
function getPageCookies(){
// cookie is a string containing a semicolon-separated list, this split puts it into an array
var cookieArr = document.cookie.split(";");
// This object will hold all of the key value pairs
var cookieObj = {};
// Iterate the array of flat cookies to get their key value pair
for(var i = 0; i < cookieArr.length; i++){
// Remove the standardized whitespace
var cookieSeg = cookieArr[i].trim();
// Index of the split between key and value
var firstEq = cookieSeg.indexOf("=");
// Assignments
var name = cookieSeg.substr(0,firstEq);
var value = cookieSeg.substr(firstEq+1);
cookieObj[name] = value;
}
return cookieObj;
}
没有。您只能读取与当前域相关联的信息。
HttpOnly
禁用的内容。这是因为它会使 XSS 攻击变得不那么强大。 - Flimm