Android CookieManager 和重定向

Android CookieManager and Redirects

我正在使用 android.webkit.CookieManager 中的 setCookie 方法设置两个 cookie - https://developer.android.com/reference/android/webkit/CookieManager.html 两个不同的 URL 具有相同的值。

但是,我知道当我在 webview 上加载第一个 URL 时,它会向我发送一个指向第二个 URL 的 HTTP 重定向,我也为其设置了 cookie。

我的问题是:cookie 管理器会发送第二个 cookie URL吗?

是的。

只要 cookie 满足要求(域、路径、安全、httponly、未过期等),WebView 就会将 cookie 与每个请求一起发送。这包括当 WebView 发出重定向请求 URL 时,如果有满足重定向 URL 要求的 cookie,则 WebView 将随请求一起发送这些 cookie。因此,如果您为重定向 URL 显式设置 cookie,那么当 WebView 遵循重定向并发出重定向请求时,它应该被包含 URL.

示例 1
使用 android.webkit.CookieManager 设置 all WebView 实例将使用的 cookie。我通常在 Activity 的 onCreate() 方法或 Fragment 的 onViewCreated() 方法中执行此操作,但您几乎可以在任何生命周期方法中配置 CookieManager,但它 必须WebView 加载 url 之前完成。这是在 onViewCreated() 中配置 CookieManager 的示例。

@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    //Replace R.id.webview with whatever ID you assigned to the WebView in your layout
    WebView webView = view.findViewById(R.id.webview);  

    CookieManager cookieManager = CookieManager.getInstance();

    //originalUrl is the URL you expect to generate a redirect
    cookieManager.setCookie(originalUrl, "cookieKey=cookieValue");

    //redirectUrl is the URL you expect to be redirected to
    cookieManager.setCookie(redirectUrl, "cookieKey=cookieValue");

    //Now have webView load the originalUrl. The WebView will automatically follow the redirect to redirectUrl and the CookieManager will provide all cookies that qualify for redirectUrl.
    webView.loadUrl(originalUrl);

}

示例 2
如果您知道重定向 URL 将在同一个顶级域中,例如。 mydomain.com 将重定向到 redirect.mydomain.com,或者 www.mydomain.com 将重定向到 subdomain.mydomain.com,或者 subdomain.mydomain.com 将重定向到 mydomain.com,然后 您可以为整个 mydomain.com 设置一个 cookie。

@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    //Replace R.id.webview with whatever ID you assigned to the WebView in your layout
    WebView webView = view.findViewById(R.id.webview);  

    CookieManager cookieManager = CookieManager.getInstance();

    //Set the cookie for the entire domain - notice the use of a . ("dot") at the front of the domain
    cookieManager.setCookie(".mydomain.com", "cookieKey=cookieValue");

    //Now have webView load the original URL. The WebView will automatically follow the redirect to redirectUrl and the CookieManager will provide all cookies for the domain.
    webView.loadUrl(originalUrl);

}