2016-08-07 4 views
1

나는 웹 사이트에 로그인하여 긁는 Android 앱을 만들었습니다. 불행히도 JSoup 및 지속되는 세션 쿠키에 문제가 있습니다.세션 쿠키가 JSoup와 지속되지 않음

POST 요청을 시도 할 때마다 웹 사이트에서 세션이 만료되었다고 불평합니다. 문제의 원인을 JSESSIONID 쿠키로 격리했습니다 (로그인하려고 시도하는 동안 브라우저에서 삭제하면 동일한 결과가 나타남). 그러나 .cookies() 방법을 사용하여 이전 쿠키를 모두 포함하더라도 웹 사이트는 세션이 만료되었다는 불만을 계속 제기합니다.

내 앱이 세션을 올바르게 유지하는 것을 막는 명백한 실수를하고 있는지 궁금합니다.

지금까지 내 코드의 관련 부분 (참고 :이 프로젝트에 대한 코 틀린를 사용하고 있습니다) :

val url = "omitted here" 
val username = "user" 
val password = "hunter2" 

val initial = Jsoup.connect(url) 
      .method(Connection.Method.GET).execute() 

val cookies = initial.cookies() 

val login = Jsoup.connect(url) 
      .userAgent("Mozilla") 
      .data("login_name", username) 
      .data("password", password) 
      .cookies(cookies) 
      .post() 

어떤 도움을 크게 감상 할 수있다!

+0

댓글을 기반으로하면 Kotlin의 문제가 아니며 페이지가 서버에서 쿠키를 반환하지 않고 나중에 JavaScript를 통해 쿠키를 반환합니다. 웹 브라우저에서 JavaScript를 끄고 웹 브라우저에 여전히 쿠키가 있는지 확인하십시오. 나는 당신이 접근하려는 페이지를 모른 채 더 많은 것을 할 수 있다고 생각하지 않는다. 하지만이 질문에 답하는 대신에 페이지를 디버깅 할 것입니다. –

답변

1

JavaScript가 나중에는 쿠키가 아니라 서버에 의해 쿠키가 설정되었다고 가정하면 코드가 올바르게 표시됩니다. 누락 된 코드가 없다고 가정하면 쿠키는 두 번째 요청에 포함되어야합니다. 사이트가 작동하는 방식과 쿠키를 사용하는 방식을 잘못 해석 한 것일 수 있으며, 로그인 할 때까지 유효한 쿠키를 할당하지 않고 로그인하지 않은 쿠키에 대해 항상 "세션 만료"에 대해 불만을 제기 할 수도 있습니다. 어쩌면 코드 버그가 아니라 논리 문제 일 수 있습니다.

그러나 다음 계정에 뭔가를하지 않으면 전체 코드 도 잘못 될 수있다 : 당신은 기억 할 필요가

을의 Jsoup 라이브러리에만 요청에 대한 쿠키를 반환 특정 요청을 수신 할 때 서버의 Set-Cookie 헤더 그것은 이 아니며은 "알려진 모든 쿠키"목록을 반환합니다. 따라서 각 쿠키 응답이 지속적으로 축적되는지도를 유지해야합니다.

response.cookies() 메서드를 실제로 response.newCookiesAddedFromThisRequest()이라고 생각하십시오. 반환 된 새 쿠키는 쿠키의 관리지도에 각 시간을 추가하고, 모든 쿠키의 총합은 각 요청을 보내,이 코드에서

val cookies = mutableMapOf<String, String>() 

val initialResponse = Jsoup.connect("http://www.whatarecookies.com/cookietest.asp") 
    .method(Connection.Method.GET) 
    .cookies(cookies) 
    .execute() 
cookies.putAll(initialResponse.cookies()) 

val secondResponse = Jsoup.connect("http://www.whatarecookies.com/cookietest.asp") 
    .method(Connection.Method.GET) 
    .cookies(cookies) 
    .execute() 
cookies.putAll(secondResponse.cookies()) 

// `cookies` now contains all cookies added accumulatively 

: 코드 패턴입니다.

참고 : Jsoup는 헤더 순서로 쿠키를 처리하지 않으므로 쿠키에 잘못된 값이 설정되는 경우가 있습니다. 또한 실수로 쿠키 값을 null로 유지할 수도 있습니다. Jsoup에 대해 known cookie issues을 확인해야합니다. 대안은 OkHttp과 같은 것을 사용하여 문서를 검색 한 다음 Jsoup를 사용하여 구문 분석하는 것입니다. Jsoup는 HTML 구문 분석 및 조작시 HTTP 프로토콜에 중점을 두지 않습니다.

+0

나는 귀하의 코드 솔루션을 시도하고 요청을 만들기 위해 OkHttp를 사용했지만 어느쪽에도 주사위 ...나는 또한 양식 POST 후에 보호 된 리소스에 다른 GET 요청을 추가하여 올바른 쿠키가 사실 이후에 설정되었는지 확인하려고 시도했으나 작동하지도 않았다. 나는 서버가 쿠키 처리와 함께 기괴한 일을한다고 가정 할 수있다. – cmdd

+0

서버의 쿠키 인 경우, JSoup에서 쿠키를 볼 수있다. 응답 할 때 필터를 적용하지 않고 아무 것도 필터링하지 않습니다. 따라서 JavaScript 추가 쿠키가 될 수 있습니다. 모든 스크립트가 완료된 후 풀 브라우저를 사용하여 요청을 처리하고 마지막 페이지를 리턴하는 서버 측 스크래핑 시스템을 사용해야 할 수도 있습니다. 그건 전혀 다른 것입니다 .... –

+0

NoScript로 페이지에 로깅을 시도했는데 완벽하게 작동했습니다 ... 지금 Selendroid를 사용해 보도록하겠습니다. (또는 WebView를 사용할 수도 있습니다.). 그래도 도움을 주셔서 감사합니다! – cmdd

관련 문제