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

Android SDK 31 WebView中Set-Cookie缺失SameSite属性的客户端解决办法

客户端层面解决Android SDK 31+跨站Cookie拦截问题

针对服务器返回的Set-Cookie未携带SameSite=None;Secure导致SDK31+跨站请求时Cookie被拦截的问题,客户端可以通过以下几种方式处理:

1. 全局自定义CookieManager修改响应头

通过继承系统CookieManager,拦截并修改响应中的Set-Cookie字段,自动补充缺失的属性:

public class CustomCookieManager extends CookieManager {
    @Override
    public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException {
        List<String> modifiedCookies = new ArrayList<>();
        for (Map.Entry<String, List<String>> entry : responseHeaders.entrySet()) {
            if ("Set-Cookie".equalsIgnoreCase(entry.getKey())) {
                for (String cookie : entry.getValue()) {
                    // 仅为未包含目标属性的Cookie补充字段
                    boolean hasSameSite = cookie.contains("SameSite=None");
                    boolean hasSecure = cookie.contains("Secure");
                    if (!hasSameSite || !hasSecure) {
                        StringBuilder sb = new StringBuilder(cookie);
                        if (!hasSameSite) sb.append("; SameSite=None");
                        if (!hasSecure) sb.append("; Secure");
                        modifiedCookies.add(sb.toString());
                    } else {
                        modifiedCookies.add(cookie);
                    }
                }
                responseHeaders.put("Set-Cookie", modifiedCookies);
            }
        }
        super.put(uri, responseHeaders);
    }
}

在Application初始化时设置为全局CookieHandler:

@Override
public void onCreate() {
    super.onCreate();
    CookieHandler.setDefault(new CustomCookieManager());
}

2. WebView场景下拦截响应修改Cookie

如果问题出在WebView加载跨站页面的场景,可以通过WebViewClient拦截请求响应,修改Set-Cookie头:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        WebResourceResponse response = super.shouldInterceptRequest(view, request);
        if (response == null || response.getResponseHeaders() == null) return response;

        Map<String, String> originalHeaders = response.getResponseHeaders();
        Map<String, String> newHeaders = new HashMap<>(originalHeaders);
        List<String> updatedCookies = new ArrayList<>();

        // 处理Set-Cookie字段
        for (Map.Entry<String, String> entry : originalHeaders.entrySet()) {
            if ("Set-Cookie".equalsIgnoreCase(entry.getKey())) {
                String cookie = entry.getValue();
                if (!cookie.contains("SameSite=None") || !cookie.contains("Secure")) {
                    StringBuilder sb = new StringBuilder(cookie);
                    if (!cookie.contains("SameSite=None")) sb.append("; SameSite=None");
                    if (!cookie.contains("Secure")) sb.append("; Secure");
                    updatedCookies.add(sb.toString());
                } else {
                    updatedCookies.add(cookie);
                }
            }
        }

        if (!updatedCookies.isEmpty()) {
            newHeaders.put("Set-Cookie", String.join(", ", updatedCookies));
            response.setResponseHeaders(newHeaders);
        }
        return response;
    }
});

同时需要开启WebView的第三方Cookie支持:

WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDomStorageEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
    CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
}

注意事项

  • 仅在跨站HTTPS请求场景下添加SameSite=None;Secure:HTTP请求添加Secure会导致Cookie无法被保存,同站请求不需要强制添加SameSite=None,可通过对比请求域名和当前应用域名判断是否为跨站。
  • 客户端修改只是临时 workaround,最优方案还是推动服务器端直接修改Set-Cookie响应头,避免客户端修改带来的兼容性或后续系统版本限制问题。

内容的提问来源于stack exchange,提问作者Stack Diego

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:09:24