2012-08-13 47 views
2

我想在發佈請求後保存cookie。對於HttpClient的實現類:HttpPost cookies堅持android

public class JSONParser { 
    CookieStore store = new BasicCookieStore(); 
     static InputStream is = null; 
     static JSONObject jObj = null; 
     static String json = ""; 
     private static final DefaultHttpClient httpClient = new DefaultHttpClient() ; 
    public static DefaultHttpClient getInstance() { return httpClient; } 

    public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) { 

     // Making HTTP request 
     try { 
      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); 

      DefaultHttpClient httpClient = JSONParser.getInstance(); 
      List<Cookie> cookies = httpClient.getCookieStore().getCookies(); 
      httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "Android-AEApp,ID=2435743"); 
      httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109); 
      HttpPost httpPost = new HttpPost(url); 
      httpPost.setEntity(new UrlEncodedFormEntity(params)); 
      httpPost.setHeader("User-Agent","Android-AEApp,ID=2435743"); 

      cookies = httpClient.getCookieStore().getCookies(); 
      httpPost.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
      httpPost.setHeader("Cookie", "PHPSESSID=lc89a2uu0rj6t2p219gc2cq4i2; path=/"); 
      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      cookies = httpClient.getCookieStore().getCookies(); 

      if (cookies.isEmpty()) { 
       for (Cookie a : cookies) 
       cookieStore.addCookie(a); 
      } else { 
       for (Cookie a : cookies) { 
        cookieStore.addCookie(a); 
        System.out.println("- " + a.getValue().toString()); 
       } 
      } 

      is = httpEntity.getContent(); 


     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 

我爲我的DefaultHttpClient創建singlotone,並希望與其他請求使用它。當我試圖這樣做:

HttpResponse httpResponse = httpClient.execute(httpPost, localContext); 

我得不到餅乾。當我不包括localContext,我可以得到餅乾

if (cookies.isEmpty()) { 
       for (Cookie a : cookies) 
       cookieStore.addCookie(a); 
      } else { 
       for (Cookie a : cookies) { 
        cookieStore.addCookie(a); 
        System.out.println("- " + a.getValue().toString()); 
       } 
      } 

但cookies不會在第二個請求設置。我猜 - 理由是不使用localContext。告訴我什麼是問題,如何設置cookie,如果他們一直在改變?

回答

4

我用我的Cookies的ArrayList的Singletone。它看起來像這樣:

public class CookieStorage { 


    private ArrayList<Object> arrayList; 

    private static CookieStorage instance; 

    private CookieStorage(){ 
     arrayList = new ArrayList<Object>(); 
    } 

    public static CookieStorage getInstance(){ 
     if (instance == null){ 
      instance = new CookieStorage(); 
     } 
     return instance; 
    } 

    public ArrayList<Object> getArrayList() { 
     return arrayList; 
    } 

    @Override 
    public String toString() 
    {  
    return getArrayList().toString(); 
    } 
} 

而且我的HttpClient類:

public class HttpClient { 
static InputStream is = null; 
private static final DefaultHttpClient httpClient = new DefaultHttpClient() ; 
public static DefaultHttpClient getInstance() { return httpClient; } 

public static InputStream getResponse(String url, List<NameValuePair> params) 
{ 
    try { 
    CookieStore cookieStore = new BasicCookieStore(); 
    DefaultHttpClient httpClient = JSONParser.getInstance();   
    httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "Android-AEApp,ID=2435743"); 
    httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109); 
    BasicClientCookie cookie = new BasicClientCookie("PHPSESSID", "1"); 
    httpClient.setCookieStore(cookieStore); 
    HttpPost httpPost = new HttpPost(url); 
    httpPost.setEntity(new UrlEncodedFormEntity(params)); 
    httpPost.setHeader("User-Agent","Android-AEApp,ID=2435743"); 
    httpPost.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
    System.out.println(CookieStorage.getInstance().toString()); 
    if (CookieStorage.getInstance().getArrayList().isEmpty()) 
     CookieStorage.getInstance().getArrayList().add("PHPSESSID=lc89a2uu0rj6t2p219gc2cq4i2"); 
    httpPost.setHeader("Cookie", CookieStorage.getInstance().getArrayList().get(0).toString()); 
    HttpResponse httpResponse = httpClient.execute(httpPost); 
    Header[] head = httpResponse.getAllHeaders(); 
    System.out.println(cookie); 

    if (httpResponse.getLastHeader("Set-Cookie")!=null) 
    { 

     CookieStorage.getInstance().getArrayList().remove(0); 
     CookieStorage.getInstance().getArrayList().add(httpResponse.getLastHeader("Set-Cookie").getValue()); 
    } 
    Log.i("arrayList",(CookieStorage.getInstance().getArrayList().toString())); 

    HttpEntity httpEntity = httpResponse.getEntity(); 
    is = httpEntity.getContent(); 


    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return is; 
} 


}