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会判定为加载成功。可以:- 移除
.placeholder(R.drawable.tier_4_excel_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
相关产品推荐
相关产品推荐

