首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OkHttp CookieJar未能向请求添加cookie

OkHttp CookieJar未能向请求添加cookie
EN

Stack Overflow用户
提问于 2017-10-12 20:52:10
回答 1查看 5.1K关注 0票数 6

我试图通过使用CookieJar将保存的身份验证cookie添加到进一步的请求中。虽然获得正确的身份验证cookie并将其保存到jar中非常有效,但在检查response.request().headers()时却找不到cookie。

我发现这一点特别奇怪,因为我通过调试发现请求调用了loadForRequest()并返回了正确的cookie。在Postman中使用完全相同的cookie来伪造请求时,它会返回所需的结果(一个没有登录表单的页面)。

有人能解释一下我错过了什么吗?

使用jar的

代码语言:javascript
复制
class HTMLRoutes {
    var scheme = "https"
    var host = "www.mangaupdates.com"
    val cookieJar = MULoginCookieJar()
    var client = OkHttpClient.Builder()
            .cookieJar(cookieJar)
            .build()
/*Other code*/

private fun getHTMLFromUrl(url: HttpUrl): String {
        var request = Request.Builder()
                .url(url)
                .build()
        client.newCall(request).execute().use { response ->
        //Right before returning response the loadForRequest() method gets called in the MUCookieJar class
            if (response.isSuccessful) {
            //response.request.headers = ""
                if (response.body() != null) {
                    return response.body()!!.string()
                } else {
                    throw IOException("Response body is empty")
                }
            } else {
                throw IOException("Unexpected code" + response)
            }
        }
    }
}

我的厨艺

代码语言:javascript
复制
class MULoginCookieJar : CookieJar {
    private var secureSessionCookie: Cookie? = null

    override fun saveFromResponse(url: HttpUrl?, cookies: MutableList<Cookie>?) {
        if (url != null && cookies != null) {
            if (url.pathSegments().size > 0 && url.pathSegments()[0] == "login.html") {
                for (cookie in cookies) {
                    if(cookie.name() == "secure_session") {
                        secureSessionCookie = cookie
                    }
                }
            }
        }
    }

    override fun loadForRequest(url: HttpUrl?): List<Cookie>? { // url = https://www.mangaupdates.com/series.html?id=14829
        if(url != null && url.pathSegments().size > 0 && url.pathSegments()[0] == "login.html") {
            return emptyList()
        }

        val cookies: List<Cookie> = if(secureSessionCookie==null) emptyList() else listOf(secureSessionCookie!!)
        return cookies // = ["secure_session=601bbc74; expires=Sun, 07 Oct 2018 20:45:24 GMT; domain=www.mangaupdates.com; path=/; secure; httponly"]
    }
}

帮助是非常感谢的。我已经潜伏了很长一段时间,但这是我第一次遇到这样的问题。

EN

回答 1

Stack Overflow用户

发布于 2017-10-16 20:38:18

我建议使用现有的cookie jar,而不是创建自己的。饼干周围的规则可能会变得有点复杂。

代码语言:javascript
复制
import okhttp3.JavaNetCookieJar;

CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager);

OkHttpClient client = new OkHttpClient.Builder().cookieJar(cookieJar).build();

此外,为了帮助调试,您可以设置带有拦截器的OkHttp调试日志记录

代码语言:javascript
复制
Logger logger = LoggerFactory.getLogger(HttpUtil.class);
HttpLoggingInterceptor logging =
    new HttpLoggingInterceptor((msg) -> {
        logger.debug(msg);
    });
logging.setLevel(Level.BODY);

client.addNetworkInterceptor(logging);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46718693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档