CookieManagerでSecure属性のついたCookieを取得する方法
CookieManagerを使ったcookieの参照のしかた
Created at

669 Words
⚠️

要点

CookieManagerを使用してSecure属性の付いたCookieを取得するには、CookieManager#getCookieに渡す文字列にはhttps://から始まるURLを渡さなければならない。 (※HttpOnly属性も同様)

WebViewとCookieManager

AndroidでWebViewを使用して閲覧しているページのCookieをプログラム側で取得するには次のようにWebViewCookieManagerを準備する。

class HogeActivity : AppCompatActivity() {
    private val cookieManager = CookieManager.getInstance()
    private lateinit var binding : ActivityHogeBinding

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        binding = ActivityHogeBinding.inflate(layoutInflater)
        setContentView(binding.root)
        initializeWebView(binding.webView)
    }

    override fun finish() {
        // WebView次回利用時に現在のページから始まらないようにするために必要
        binding.webView.loadUrl("about:blank")
        super.finish()
    }

    // ------ //

    private fun initializeWebView(webView: WebView) {
        cookieManager.acceptCookie()
        cookieManager.setAcceptThirdPartyCookies(webView, true)
        // ほか色々設定

        webView.loadUrl("https://~~~")
    }
}

CookieManager#getCookie(URL or Domain)を使用してkey0=value0; key1=value1; ...の書式でCookie文字列が取得できるので、適当に連想配列にしたり必要なものだけ取り出したり。

@OptIn(ExperimentalStdlibApi::class)
val cookies = buildMap<String, String> {
    val cookiesStr = cookieManager.getCookie(".hoge.com")
    cookiesStr.split(";").forEach {
        val separatorIndex = it.indexOf("=")
        if (separatorIndex == -1) return@forEach
        val key = it.substring(0, separatorIndex)
        val value = it.substring(separatorIndex + 1)
        put(key, value)
    }
}

上記のようにCookieManager#getCookieに”.hoge.com"のようなドメイン名を渡す場合、得られる文字列にSecure属性やHttpOnly属性がついたCookieは含まれないので注意が必要。

Secure属性がついたCookieを取得する場合は、次のように明示的にhttps://から始まるURLを渡す必要がある。

@OptIn(ExperimentalStdlibApi::class)
val cookies = buildMap<String, String> {
    val cookiesStr = cookieManager.getCookie("https://www.hoge.com")
    cookiesStr.split(";").forEach {
        val separatorIndex = it.indexOf("=")
        if (separatorIndex == -1) return@forEach
        val key = it.substring(0, separatorIndex)
        val value = it.substring(separatorIndex + 1)
        put(key, value)
    }
}

せやろなという感じだった。

HTTP Cookie の使用 - HTTP | MDN

See Also