首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 動態替換 Cookie 字串中 JSESSIONID 的最佳實踐

     編輯:程式設計綜合問答

在處理支付寶、銀聯等金融介面時,常需從原始 Cookie 字串中提取並動態替換 JSESSIONID 等關鍵 Token。由於 Cookie 內容動態變化、格式雜亂(包含 Path、HttpOnly、Secure 等屬性),單純字串取代極易出錯。本文提供結構化解析與安全替換方案。

資料結構化:將 Cookie 解析為 Dictionary

/// 
/// 將原始 Cookie 字串解析為鍵值對集合,自動處理屬性片段
/// 
public static Dictionary ParseCookie(string rawCookie)
{
    var dict = new Dictionary(StringComparer.OrdinalIgnoreCase);
    if (string.IsNullOrWhiteSpace(rawCookie)) return dict;

    // 以分號分割,每段可能為 "key=value" 或 "key=value; Path=/; HttpOnly"
    foreach (var part in rawCookie.Split(';'))
    {
        var kv = part.Trim().Split(new[] { '=' }, 2);
        if (kv.Length == 2)
        {
            // 僅取第一個 "=" 前為 key,後為 value(忽略後續屬性)
            dict[kv[0].Trim()] = kv[1].Trim().Split(';')[0].Trim();
        }
    }
    return dict;
}

精準替換並重組 Cookie 標頭

public static string ReplaceCookieValue(string rawCookie, string targetKey, string newValue)
{
    var dict = ParseCookie(rawCookie);
    if (dict.ContainsKey(targetKey))
    {
        dict[targetKey] = newValue;
    }
    // 重組為標準 "k1=v1; k2=v2" 格式(不帶屬性,供請求標頭使用)
    return string.Join("; ", dict.Select(kv => $"{kv.Key}={kv.Value}"));
}

// 使用範例
string original = "cna=xxx; JSESSIONID=9B4B199EEB702BEE2B7D516BA1CB6F8C; Path=/; HttpOnly; ...";
string newJsId = "RZ056Dar6pgE6inNmivJBB3ya80WKxauthRZ05GZ00";
string updatedCookie = ReplaceCookieValue(original, "JSESSIONID", newJsId);
// 直接塞入 HttpRequestMessage.Headers.Add("Cookie", updatedCookie);

進階:保留屬性的完整重建(如需回寫 Set-Cookie)

若下游系統要求保留 Path、Secure、HttpOnly 等屬性,可擴充模型:

public class CookieItem
{
    public string Name { get; set; }
    public string Value { get; set; }
    public string Path { get; set; } = "/";
    public bool HttpOnly { get; set; }
    public bool Secure { get; set; }
    public DateTime? Expires { get; set; }
    public string Domain { get; set; }
    public string SameSite { get; set; } = "Lax";

    public override string ToString() => 
        $"{Name}={Value}; Path={Path}; HttpOnly={(HttpOnly ? "true" : "false")}; Secure={(Secure ? "true" : "false")}" +
        (Expires.HasValue ? $"; Expires={Expires.Value:R}" : "") +
        (string.IsNullOrEmpty(Domain) ? "" : $"; Domain={Domain}") +
        $"; SameSite={SameSite}";
}

解析時用正則完整捕獲屬性,替換 Value 後 ToString() 即可得到標準 Set-Cookie 格式。

避坑指南

  • 編碼一致性:Cookie 值若含特殊字元(如 +、%),替換前後請確認是否需 Uri.EscapeDataString。
  • 大小寫不敏感:Cookie 名稱不區分大小寫,字典建議用 StringComparer.OrdinalIgnoreCase。
  • 多域名隔離:若同一請求涉及多個 Domain,務必依 Domain 屬性分組管理,避免跨站 Cookie 洩漏。

採用結構化解析取代硬編碼 Split/Replace,不僅程式碼可讀性大增,更能應對金融級介面頻繁變動的 Cookie 格式,是 C# 開發者處理 HTTP 狀態管理的必備技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved