2010-08-27 48 views
40

我試圖登錄到一個網站,並維持該會話/ cookie,以便服務器將識別我的登錄名,但我很努力想出一種方法從響應中提取cookie並設置爲維護我的登錄請求。我想知道是否應該採取頭「Set-Cookie」或使用CookieStore。任何幫助是極大的讚賞。這裏是我的代碼,其中有我認爲getHeader/getCookie方法會去的註釋。如何在Android和/或Java中使用HttpClient管理Cookie?

public class Http 
{ 
DefaultHttpClient client = new DefaultHttpClient(); 
HttpGet request; 
HttpEntity entity; 
HttpResponse response; 
HttpPost post; 
CookieStore cookieStore = new BasicCookieStore(); 
HttpContext localContext = new BasicHttpContext(); 

public static void setContext() 
{ 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 
} 

public static void getPage(String url) throws Exception 
{ 
    request = new HttpGet(url); 
    response = client.execute(request, localContext); 
    PARSER.preParse(url, response); 
} 

public static HttpResponse postPage(List<NameValuePair> params, String host, String action) throws Exception 
{ 
    post = new HttpPost(host + action); 
    post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 

    response = client.execute(post, localContext); 

    entity = response.getEntity(); 
    if(entity != null) 
    { 
     entity.consumeContent(); 
    } 

    return response; 
} 


public void destoyHttp() 
{ 
    client.getConnectionManager().shutdown(); 
} 
} 

在別人更好地理解我的困惑我加入的代碼,我知道不工作,並保持會話,但是當我試圖將代碼移植到我的實際應用中它的地方下了線突破的希望。

public class HttpClientTest extends Activity{ 

DefaultHttpClient client = new DefaultHttpClient(); 
HttpGet request; 
HttpEntity entity; 
List<Cookie> cookies; 
HttpResponse response; 
HttpPost post; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try { 
     getRequest(); 
    } catch (Exception e) { 
     Log.d("My Activity", "Failed"); 
     e.printStackTrace(); 
    } 
} 

public void getRequest() throws Exception 
{ 
    final String TAG = "MyActivity"; 
    request = new HttpGet("http://gc.gamestotal.com/i.cfm?p=login&se=4"); 
    response = client.execute(request); 

    String action = "i.cfm?&1028&p=login&se=4"; 
    String yourServer = "http://gc.gamestotal.com/"; 
    post = new HttpPost(yourServer + action); 

    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("nic", "myusername")); 
    params.add(new BasicNameValuePair("password", "mypassword")); 
    params.add(new BasicNameValuePair("server", "4")); 

    post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 


    response = client.execute(post); 
    entity = response.getEntity(); 

    if(entity != null){ 
     entity.consumeContent(); 
    } 

    request = new HttpGet("http://gc.gamestotal.com/i.cfm?f=com_empire&cm=3"); 

    response = client.execute(request); 

    if(entity != null) 
    { 
     entity.consumeContent(); 
    }  

} 

} 

我知道它的工作原理其實你可以看到,在該代碼我consumeContent(),但補充說頂端代碼似乎並沒有發揮作用,所以我離開了出來。有任何想法嗎?

編輯:我仍然無法讓代碼工作保持會話進行。我從我當前的代碼發佈cookie,以及正在工作的第二個代碼的cookie。也許有人會注意到一個問題,我當然不會。

08-31 06:53:50.318: VERBOSE/SFGC(496): - [version: 0][name: CFID][value: 26651316][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:50.329: VERBOSE/SFGC(496): - [version: 0][name: CFTOKEN][value: 96917381][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:50.329: VERBOSE/SFGC(496): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125416524430%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A53%3A45%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:50.339: VERBOSE/SFGC(496): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D2%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A53%3A45%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A53%3A39%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 

08-31 06:53:51.938: VERBOSE/SFGC(496): - [version: 0][name: CFID][value: 26651316][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:51.938: VERBOSE/SFGC(496): - [version: 0][name: CFTOKEN][value: 96917381][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:51.938: VERBOSE/SFGC(496): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125416524430%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A53%3A45%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:53:51.948: VERBOSE/SFGC(496): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D3%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A53%3A46%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A53%3A39%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 


08-31 06:52:41.628: DEBUG/MyActivity(469): - [version: 0][name: CFID][value: 26651274][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:41.638: DEBUG/MyActivity(469): - [version: 0][name: CFTOKEN][value: 58361320][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:41.638: DEBUG/MyActivity(469): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125815099420%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A52%3A36%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:41.648: DEBUG/MyActivity(469): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D2%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A52%3A36%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A52%3A33%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 

08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFID][value: 26651274][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFTOKEN][value: 58361320][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFCLIENT_SFGC_106Y][value: CFTOKEN2%3D735125815099420%23COUNTRY%3D56%23DOWNLOADFLAG%3D0%23OCHAT%3D1%23PM%5FDATE%3D%7Bts+%272010%2D08%2D31+14%3A52%3A36%27%7D%23REGION%3D3%23SCREEN%3D800%23S%5FGC%5FIMAGELOC%3Di%2Fw%2F%23TIMEZONE%3D%2D600%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 
08-31 06:52:44.138: DEBUG/MyActivity(469): - [version: 0][name: CFGLOBALS][value: HITCOUNT%3D4%23LASTVISIT%3D%7Bts+%272010%2D08%2D31+14%3A52%3A38%27%7D%23TIMECREATED%3D%7Bts+%272010%2D08%2D31+14%3A52%3A33%27%7D%23][domain: gc.gamestotal.com][path: /][expiry: Sun Sep 27 00:00:00 GMT+00:00 2037] 

回答

38

您需要使用HttpContext。將Cookie存儲設置爲上下文,並在執行方法中使用HttpGet/HttpPost傳遞上下文。希望這應該有所幫助。

見例如:完整代碼可以發現here

// Create a local instance of cookie store 
    CookieStore cookieStore = new BasicCookieStore(); 

    // Create local HTTP context 
    HttpContext localContext = new BasicHttpContext(); 
    // Bind custom cookie store to the local context 
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

    HttpGet httpget = new HttpGet("http://www.google.com/"); 

    System.out.println("executing request " + httpget.getURI()); 

    // Pass local context as a parameter 
    HttpResponse response = httpclient.execute(httpget, localContext); 
+0

好的,我將如何去獲取標題?我是否從response.getHeader(「Set-Cookie」)等響應中獲取?因爲我試圖做類似的事情,但只有一個getHeaders();我猜的方法返回一個數組?我不得不再次查看它。 – 2010-08-27 19:17:37

+1

好吧,我設法使用Header []對象,併成功地設置了包括Cookie頭的標題,但似乎並沒有解決我的問題。我用我編寫的代碼編輯了我的問題,但由於某種原因,當我將其移至我的實際應用程序時,該代碼崩潰了。僅供參考,工作代碼與標題無關,它只是工作?大聲笑 – 2010-08-27 19:41:45

+0

好吧;)我設法找到我看到從您的代碼中遺失的東西,並更新(而不是改變)我的答案。 – YoK 2010-08-27 19:47:30

0

對我來說,它不工作,直到我使HttpContext和CookieStore靜態,以保持所有請求。