CefSharp中请求与响应层面的Cookie拦截及增删改操作问询
一、处理请求头的Outgoing Cookies(onBeforeResourceLoad阶段)
在请求发送前的这个阶段,我们可以拦截请求头里的Cookie字段,完成新增、修改、删除操作。
1. 工具函数:解析/序列化Cookie
先把Cookie字符串转成键值对对象,方便操作,用完再转回字符串:
// 把Cookie字符串转成对象 function parseCookies(cookieStr) { if (!cookieStr) return {}; return cookieStr.split(';').reduce((cookies, cookie) => { const [name, value] = cookie.trim().split('='); cookies[name] = value; return cookies; }, {}); } // 把Cookie对象转回字符串 function stringifyCookies(cookiesObj) { return Object.entries(cookiesObj) .map(([name, value]) => `${name}=${value}`) .join('; '); }
2. 新增Cookie
在现有Cookie基础上添加新的键值对:
// 以Chrome扩展webRequest API为例(对应onBeforeResourceLoad阶段) chrome.webRequest.onBeforeSendHeaders.addListener( (details) => { // 获取当前请求的Cookie let cookiesObj = parseCookies(details.requestHeaders.find(h => h.name === 'Cookie')?.value); // 新增名为`new_custom_cookie`的Cookie cookiesObj['new_custom_cookie'] = 'custom_value_123'; // 更新请求头的Cookie字段 const cookieHeader = details.requestHeaders.find(h => h.name === 'Cookie'); if (cookieHeader) { cookieHeader.value = stringifyCookies(cookiesObj); } else { // 如果原本没有Cookie字段,直接新增 details.requestHeaders.push({ name: 'Cookie', value: stringifyCookies(cookiesObj) }); } return { requestHeaders: details.requestHeaders }; }, { urls: ['<all_urls>'] }, ['blocking', 'requestHeaders', 'extraHeaders'] );
3. 修改现有Cookie
修改指定名称的Cookie值:
chrome.webRequest.onBeforeSendHeaders.addListener( (details) => { let cookiesObj = parseCookies(details.requestHeaders.find(h => h.name === 'Cookie')?.value); // 修改`user_token`的Cookie值 if (cookiesObj['user_token']) { cookiesObj['user_token'] = 'updated_token_456'; } // 更新请求头 const cookieHeader = details.requestHeaders.find(h => h.name === 'Cookie'); if (cookieHeader) { cookieHeader.value = stringifyCookies(cookiesObj); } return { requestHeaders: details.requestHeaders }; }, { urls: ['<all_urls>'] }, ['blocking', 'requestHeaders', 'extraHeaders'] );
4. 删除Cookie
移除指定名称的Cookie:
chrome.webRequest.onBeforeSendHeaders.addListener( (details) => { let cookiesObj = parseCookies(details.requestHeaders.find(h => h.name === 'Cookie')?.value); // 删除`temp_session`Cookie delete cookiesObj['temp_session']; // 更新请求头:如果Cookie为空,直接移除Cookie字段;否则更新值 const cookieHeaderIndex = details.requestHeaders.findIndex(h => h.name === 'Cookie'); if (Object.keys(cookiesObj).length === 0) { if (cookieHeaderIndex !== -1) { details.requestHeaders.splice(cookieHeaderIndex, 1); } } else { if (cookieHeaderIndex !== -1) { details.requestHeaders[cookieHeaderIndex].value = stringifyCookies(cookiesObj); } } return { requestHeaders: details.requestHeaders }; }, { urls: ['<all_urls>'] }, ['blocking', 'requestHeaders', 'extraHeaders'] );
二、处理响应头的Incoming Set-Cookie(onResponse阶段)
在响应返回的这个阶段,拦截Set-Cookie字段,对即将被浏览器存储的Cookie做操作。
1. 工具函数:解析/序列化Set-Cookie
Set-Cookie包含名称、值和属性(过期时间、域名等),需要解析成对象:
// 解析单个Set-Cookie值 function parseSetCookie(setCookieStr) { const parts = setCookieStr.split(';').map(part => part.trim()); const [nameValue] = parts; const [name, value] = nameValue.split('='); const attrs = parts.slice(1).reduce((acc, part) => { const [key, val] = part.split('='); acc[key.toLowerCase()] = val || true; return acc; }, {}); return { name, value, ...attrs }; } // 把Set-Cookie对象转回字符串 function stringifySetCookie(cookieObj) { const parts = [`${cookieObj.name}=${cookieObj.value}`]; if (cookieObj.expires) parts.push(`Expires=${cookieObj.expires}`); if (cookieObj.domain) parts.push(`Domain=${cookieObj.domain}`); if (cookieObj.path) parts.push(`Path=${cookieObj.path}`); if (cookieObj.secure) parts.push('Secure'); if (cookieObj.httponly) parts.push('HttpOnly'); return parts.join('; '); }
2. 新增Set-Cookie
添加一个新的Cookie到响应头:
// Chrome扩展示例(对应onResponse阶段的onHeadersReceived) chrome.webRequest.onHeadersReceived.addListener( (details) => { // 构造新的Cookie对象 const newCookie = { name: 'persist_user', value: 'user_789', path: '/', domain: '.example.com', expires: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toUTCString(), secure: true }; // 加入响应头的Set-Cookie数组 details.responseHeaders.push({ name: 'Set-Cookie', value: stringifySetCookie(newCookie) }); return { responseHeaders: details.responseHeaders }; }, { urls: ['<all_urls>'] }, ['blocking', 'responseHeaders', 'extraHeaders'] );
3. 修改现有Set-Cookie
修改指定Cookie的值或属性:
chrome.webRequest.onHeadersReceived.addListener( (details) => { const setCookieHeaders = details.responseHeaders.filter(h => h.name === 'Set-Cookie'); setCookieHeaders.forEach(header => { const cookieObj = parseSetCookie(header.value); // 修改名为`session_id`的Cookie值和过期时间 if (cookieObj.name === 'session_id') { cookieObj.value = 'new_session_000'; cookieObj.expires = new Date(Date.now() + 2 * 60 * 60 * 1000).toUTCString(); // 延长2小时 header.value = stringifySetCookie(cookieObj); } }); return { responseHeaders: details.responseHeaders }; }, { urls: ['<all_urls>'] }, ['blocking', 'responseHeaders', 'extraHeaders'] );
4. 删除Set-Cookie
移除指定名称的Cookie:
chrome.webRequest.onHeadersReceived.addListener( (details) => { // 过滤掉指定名称的Set-Cookie details.responseHeaders = details.responseHeaders.filter(header => { if (header.name !== 'Set-Cookie') return true; const cookieObj = parseSetCookie(header.value); return cookieObj.name !== 'temp_cookie'; }); return { responseHeaders: details.responseHeaders }; }, { urls: ['<all_urls>'] }, ['blocking', 'responseHeaders', 'extraHeaders'] );
内容的提问来源于stack exchange,提问作者Maruthi Gowda
相关产品推荐
相关产品推荐

