You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CefSharp中请求与响应层面的Cookie拦截及增删改操作问询

拦截并管理请求/响应中的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做操作。

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('; ');
}

添加一个新的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']
);

修改指定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']
);

移除指定名称的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:32:24