2015-01-17 4 views
1

httpclient로 xing에 로그인 할 때 몇 가지 문제가 있습니다. livehttpheaders를 사용하여 수동으로 로그인하고 addHeader("Cookie", "....")으로 쿠키 값을 재설정 할 때 작동합니다. 하지만 브라우저에서 로그 아웃하면 더 이상 작동하지 않습니다. 쿠키를 저장하여 모든 게시물에 보내거나 방법을 얻어야한다고 가정합니다. BasicCookieStore에서 시도했지만 모든 쿠키가 저장되지 않았습니다. 내가 실행하면이 :httpclient로 Xing에 로그인하십시오.

BasicCookieStore cookieStore = new BasicCookieStore(); 
HttpContext httpContext = new BasicHttpContext(); 
httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 
CloseableHttpClient httpclient = HttpClients.custom() 
      .setDefaultCookieStore(cookieStore) 
      .build(); 
try { 
    HttpGet httpget = new HttpGet("https://www.xing.com/"); 
    CloseableHttpResponse response = httpclient.execute(httpget, httpContext); 
    try { 
     HttpEntity entity = response.getEntity(); 

     System.out.println("Login form get: " + response.getStatusLine()); 
     EntityUtils.consume(entity); 

     System.out.println("Initial set of cookies:"); 
     List<Cookie> cookies = cookieStore.getCookies(); 
     if (cookies.isEmpty()) { 
      System.out.println("None"); 
     } else { 
      for (int i = 0; i < cookies.size(); i++) { 
       System.out.println("- " + cookies.get(i).toString()); 
      } 
     } 
    } finally { 
     response.close(); 
    } 
    HttpPost httpPost = new HttpPost("https://login.xing.com/login"); 
    List <NameValuePair> nvps = new ArrayList <NameValuePair>(); 
    nvps.add(new BasicNameValuePair("username", "name%40host.com")); 
    nvps.add(new BasicNameValuePair("password", "mypassword")); 
    httpPost.setEntity(new UrlEncodedFormEntity(nvps)); 
    httpPost.addHeader("Referer", "https://www.xing.com/"); 
    httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0"); 

    CloseableHttpResponse response1 = httpclient.execute(httpPost, httpContext); 
    try { 
     HttpEntity entity = response1.getEntity(); 
     System.out.println("Login form get: " + response1.getStatusLine()); 
     EntityUtils.consume(entity); 

     System.out.println("Post logon cookies:"); 
     List<Cookie> cookies = cookieStore.getCookies(); 
     if (cookies.isEmpty()) { 
      System.out.println("None"); 
     } else { 
      for (int i = 0; i < cookies.size(); i++) { 
       System.out.println("- " + cookies.get(i).toString()); 
      } 
     } 
    } finally { 
     response1.close(); 
    } 

내가 얻을 :

Login form get: HTTP/1.1 200 OK 
Initial set of cookies: 
- [version: 0][name: c_][value: 0x11791BDA9E4611E49EF65B88668E3E29][domain: .xing.com][path: /][expiry: Fri Jan 12 14:40:50 CET 2035] 
Login form get: HTTP/1.1 302 Found 
Post logon cookies: 
- [version: 0][name: _session_id][value: 335a78c6dca029dc47e1a7d6f86e2736][domain: login.xing.com][path: /][expiry: null] 
- [version: 0][name: c_][value: 0x11791BDA9E4611E49EF65B88668E3E29][domain: .xing.com][path: /][expiry: Fri Jan 12 14:40:50 CET 2035] 

하지만 일부 쿠키가 누락 생각합니다. 내가 수동으로 로그인 할 때마다 더 많은 쿠키 s_cc, s_sq, s_vi, s_fid과 로그인 할 때마다 3 가지가 있습니다. login, xing, and reg_ref 이제 내 질문 : 쿠키를 가져 와서 모든 방법으로 올바르게 보내려면 어떻게해야합니까?

답변

0

쿠키를 처리하기 위해 httpclient의 쿠키 정책을 설정해야합니다. 쿠키 저장소가 비어있는 이유가 지정된 쿠키 정책을 위반할 수 있으므로 가장 적합한 쿠키 정책을 찾아야합니다.

아파치 HttpClient를 3 + 예를

httpclient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY); 

아파치 HttpClient를 4.3 예를

RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.BROWSER_COMPATIBILITY).build(); 
CookieStore cookieStore = new BasicCookieStore(); 
HttpClientContext context = HttpClientContext.create(); 
context.setCookieStore(cookieStore); 

CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(globalConfig).setDefaultCookieStore(cookieStore).build() 

here

+0

이 답변 주셔서 감사하지만 끝난 CookiePolicy를 변경하면 작동하지 않습니다 끝난 CookiePolicy 아파치 HttpClient를에 대해 자세히 나를 위해. 'Browser_Compatibility'와'Best_Match'를 사용하면 위와 같은 쿠키를 받게됩니다. '넷스케이프'와 '스탠다드'에서는 쿠키가 발견되지 않았다. 내 목록에 나타나지 않기 때문에'RFC_2109'을 어떻게 테스트 할 수 있습니까? 내 코드에 또 다른 문제가있을 수 있습니까? – Michael

관련 문제