如何用JavaScript在客户端判断Cookie是否为会话Cookie及来源页面?
一、判断是否为会话Cookie
- 会话Cookie的关键特点是未设置
expires或max-age属性。浏览器对没有这两个属性的Cookie,会在关闭浏览器(会话结束)时自动删除,这就是标准的会话Cookie。 - 注意:不能只检查
expires,还要看max-age——如果设置了max-age=0是立即过期,max-age为正数则是持久Cookie,只有完全不设置这两个属性,才是会话Cookie。
解析Cookie并判断会话Cookie的示例代码:
function isSessionCookie(cookieName) { const cookies = document.cookie.split(';').map(c => c.trim()); for (const cookie of cookies) { const [namePart, ...rest] = cookie.split('='); const name = namePart.trim(); if (name === cookieName) { // 检查是否包含expires或max-age属性 return !cookie.includes('expires=') && !cookie.includes('max-age='); } } return false; // 目标Cookie不存在 } // 使用示例 console.log(isSessionCookie('username'));
二、判断Cookie是当前页面生成还是其他页面携带
浏览器不会给客户端JavaScript提供Cookie的生成来源页面信息,所以没有100%准确的判断方法,只能通过path属性做间接推断:
- Cookie的
path属性默认是设置它的页面的路径(比如在/blog/detail.html页面设置的Cookie,默认path是/blog)。 - 如果Cookie的
path和当前页面的路径完全匹配或包含当前路径,有可能是当前页面或同路径下的其他页面生成的;如果path是根路径/,则大概率是网站内其他页面(比如首页、其他子页面)设置后携带过来的。 - 但这种推断并不绝对:你也可以在当前页面主动设置
path=/的Cookie,此时根本没法区分它是当前生成还是其他页面带来的。
获取Cookie的path属性的示例代码:
function getCookiePath(cookieName) { const cookies = document.cookie.split(';').map(c => c.trim()); for (const cookie of cookies) { const [namePart, ...attrParts] = cookie.split('='); const name = namePart.trim(); if (name === cookieName) { const cookieAttrs = attrParts.join('=').split(';').map(attr => attr.trim()); for (const attr of cookieAttrs) { if (attr.startsWith('path=')) { return attr.slice(5); } } // 未设置path,返回默认路径(当前页面所在的目录路径) const currentPath = window.location.pathname; return currentPath.substring(0, currentPath.lastIndexOf('/') + 1); } } return null; // 目标Cookie不存在 } // 使用示例 const cookiePath = getCookiePath('username'); console.log('Cookie的path:', cookiePath); console.log('当前页面路径:', window.location.pathname);
三、关于“无expires/path即认定为当前页面生成的会话Cookie”的结论
- 对于会话Cookie的判断是准确的:只要没有
expires和max-age属性,就可以确定是会话Cookie。 - 对于是否由当前页面生成的判断不准确:其他页面如果和当前页面路径相同,设置不带
path的Cookie,也会被当前页面获取到,此时无法区分它是当前生成还是其他页面携带的。
内容的提问来源于stack exchange,提问作者Red
相关产品推荐
相关产品推荐

