2017-10-12 4 views
2

CookieJar를 활용하여 추가 요청에 저장된 인증 쿠키를 추가하려고합니다. 그리고 정확한 인증 쿠키를 받고 그것을 항아리에 저장하는 것이 효과적 일 때, response.request().headers()을 검사 할 때 쿠키가 발견되지 않습니다.OkHttp CookieJar가 요청에 쿠키를 추가하지 못했습니다.

디버깅을 통해 알아 낸이 메시지는 loadForRequest()이 요청에 대해 호출되어 올바른 쿠키를 반환하기 때문에 이상하게 느껴졌습니다. Postman에서 정확히 동일한 쿠키를 사용하여 요청을 가짜로 만들 때 원하는 결과 (로그인 양식이없는 페이지)를 반환합니다.

누락 된 부분을 설명하려고 할 수 있습니까? 항아리가

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

도움말을 활용

클래스가 대단히 감사합니다. 나는 오랫동안 잠복 해왔다. 그러나 나는 이것이 문제에 난처한 이번이 처음이다.

+0

쿠키가 전송되고 있지 않은지 확인하기 위해 무엇을하고 있습니까? 구성에 따라 쿠키가 요청에 추가되기 전에 인터셉터가 실행될 수 있습니다. –

+0

@Jesse Wilson'client.newCall (request) .execute(). use {response ->']에서 응답이 반환 된 직후 디버깅 할 때,'response'에 저장된 OkHttp Response는'response '에 빈 문자열을 가지고 있습니다. request.headers'. 이것이 쿠키가 전송되지 않았 음을 확신시키는 확실한 방법인지는 모르겠지만 쿠키가 전송되면 헤더에'Set-Cookie .......'가 있어야한다고 생각합니다. 나는 또한 나의 구현에 curently 인터셉터를 가지고 있지 않습니다. 하나 추가 하시겠습니까? –

+0

response.networkResponse(). request()와 동일합니다. –

답변

0

나만의 쿠키 병을 만드는 대신 기존의 쿠키 병을 사용하는 것이 좋습니다. 쿠키 주변의 규칙은 큰 복잡성을 낳을 수 있습니다.

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