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

Coil加载图片Cookie验证异常,始终返回占位图求助

问题描述

尝试通过Coil携带Cookie加载服务器图片:Cookie验证通过时显示正常图片,验证失败时返回占位图。当前使用以下代码加载,但始终进入onSuccess回调并加载占位图,说明Cookie验证未通过(Postman携带正确Cookie可正常显示图片)。

val request =
    ImageRequest.Builder(this)
        .placeholder(R.drawable.tier_4_excel_2)
        .addHeader("Cookie", "MoodleSession=741ait3989s5d24bvhi1j8fdpk")
        .addHeader("MoodleSession", "741ait3989s5d24bvhi1j8fdpk")
        .setHeader("Cookie", "MoodleSession=741ait3989s5d24bvhi1j8fdpk")
        .setHeader("MoodleSession", "741ait3989s5d24bvhi1j8fdpk")
        .data("https://uat.XXXX.com/pluginfile.php/217833/user/icon/backstage2/f1")
        .transformations(CircleCropTransformation())
        .target(onSuccess = { result ->
            mToolbarImage.setImageDrawable(result)
        }, onError = { error ->
            println("IMAGE LOAD ERROR >>>>>>>> $error")
            // Handle the error drawable.
        }).build()
imageLoader.enqueue(request)
解决思路及方案
  • 清理重复Header设置
    代码中同时用addHeader和setHeader重复设置Cookie和MoodleSession头,会导致请求头混乱。MoodleSession不需要单独作为Header发送,Cookie头已包含会话信息,只保留正确的Cookie设置即可:

    .addHeader("Cookie", "MoodleSession=741ait3989s5d24bvhi1j8fdpk")
    

    (addHeader和setHeader二选一即可,推荐addHeader避免意外覆盖)

  • 确认Cookie有效性
    核对Postman中使用的Cookie值与代码中的是否完全一致,注意大小写、特殊字符;同时确认Cookie是否过期,或是否需要携带其他Cookie参数(查看Postman完整请求头,确保代码包含所有必要Cookie项)。

  • 拦截请求验证Header
    给Coil添加OkHttp拦截器,打印实际发送的请求头,确认Cookie是否正确传递:

    val imageLoader = ImageLoader.Builder(context)
        .okHttpClient {
            OkHttpClient.Builder()
                .addInterceptor { chain ->
                    val request = chain.request()
                    request.headers.forEach { name, value ->
                        println("Request Header: $name = $value")
                    }
                    chain.proceed(request)
                }
                .build()
        }
        .build()
    
  • 区分占位图与服务器错误图
    当前代码的placeholder是加载过程图,若服务器验证失败时返回200状态码+错误图,Coil会判定为加载成功。可以:

    1. 移除.placeholder(R.drawable.tier_4_excel_2),避免混淆;
    2. 在onSuccess中通过图片尺寸、像素特征判断是否为服务器返回的错误图,再做对应处理。
  • 用CookieJar管理Cookie
    采用OkHttp的CookieJar规范管理Cookie,确保符合HTTP标准:

    val cookieJar = object : CookieJar {
        override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {}
        override fun loadForRequest(url: HttpUrl): List<Cookie> {
            return listOf(
                Cookie.Builder()
                    .name("MoodleSession")
                    .value("741ait3989s5d24bvhi1j8fdpk")
                    .domain(url.host)
                    .path("/")
                    .build()
            )
        }
    }
    
    val imageLoader = ImageLoader.Builder(context)
        .okHttpClient {
            OkHttpClient.Builder()
                .cookieJar(cookieJar)
                .build()
        }
        .build()
    

内容的提问来源于stack exchange,提问作者Rakshit Nawani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:12:44