2017-10-12 38 views
2

CookieJarを利用して、保存された認証Cookieを追加リクエストに追加しようとしています。そして正しい認証クッキーを取得し、それをjarファイルに保存している間、大きな成功を収めていますが、response.request().headers()を調べると、クッキーはどこにも見つかりません。OkHttp CookieJarがリクエストにクッキーを追加できません

デバッグで見つかったので、これは特に奇妙なものでした。これは、loadForRequest()が要求のために呼び出され、その正しいクッキーを返します。その正確な同じCookieをPostmanで使用してリクエストを偽装すると、目的の結果(ログインフォームのないページ)が返されます。

誰かが迷っていることを説明できますか?

クラスのjarを利用する

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) 
      } 
     } 
    } 
} 

私をCookieJar

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"] 
    } 
} 

ヘルプは非常に高く評価されています。私は長い時間のlurkerされているが、これは私が問題で困惑したのは初めてです。

+0

クッキーが送信されていないことを確認するために何をしていますか?設定に応じて、リクエストにCookieが追加される前にインターセプタが実行される可能性があります。 –

+0

@Jesse Wilson 'client.newCall(request).execute()。use {response - >'で応答が返された直後にデバッグを行うと、 'response'に格納されたOkHttp Responseに' response 'の空文字列があります。 request.headers'です。これがクッキーが送信されていないことを保証する決定的な方法であるかどうかは分かりませんが、クッキーが送信された場合、ヘッダーに 'Set-Cookie .......'私は私の実装に邪魔をしているわけでもありません。あなたは1つを追加することを提案していますか? –

+0

response.networkResponse()。request()と同じですか? –

答えて

0

独自のcookie jarを使用することをお勧めします。クッキーの周りの規則は、大きな複合体を得ることができます。

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 debug logging with an interceptorを設定することもできます。

Logger logger = LoggerFactory.getLogger(HttpUtil.class); 
HttpLoggingInterceptor logging = 
    new HttpLoggingInterceptor((msg) -> { 
     logger.debug(msg); 
    }); 
logging.setLevel(Level.BODY); 

client.addNetworkInterceptor(logging); 
関連する問題