在Android中,當使用Apache的HttpClient進行http串連時,若需要使用Cookie,則一般做法是:
// Create a local instance of cookie storecookieStore = new BasicCookieStore();// Bind custom cookie store to the local contextlocalContext = new BasicHttpContext();localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);// To perform http getHttpGet request = new HttpGet(url);HttpResponse response = new DefaultHttpClient().execute(request, localContext);if (response.getStatusLine().getStatusCode() == 200) {String result = EntityUtils.toString(response.getEntity());// log(result)}
一般情況下cookie使用沒問題,但是現在有許多大型網站,登陸驗證在是不同的域(domain),這樣就會導致cookie跨域不可寫的問題。搜尋了一下發現還挺難找解決方案的,最後還是在stackoverflow上發現的。Java HtmlUnit - can't login to wordpress
其實apache的文檔已經說明了這個問題了,請看這裡:Chapter 3. HTTP state management 拉到下邊,例子都給出來了。
做法就是自己重寫cookie策略,然後設定http client使用自訂的策略。
主要在於:
CookieSpecFactory csf = new CookieSpecFactory() { public CookieSpec newInstance(HttpParams params) { return new BrowserCompatSpec() { @Override public void validate(Cookie cookie, CookieOrigin origin) throws MalformedCookieException { // Oh, I am easy } }; }};DefaultHttpClient httpclient = new DefaultHttpClient();httpclient.getCookieSpecs().register("easy", csf);httpclient.getParams().setParameter( ClientPNames.COOKIE_POLICY, "easy");