2010-05-18 3 views
3

임 지금Android에서 DefaultHttpClient를 사용하여 영구 쿠키를 만드는 방법은 무엇입니까?

// this is a DefaultHttpClient 
List<Cookie> cookies = this.getCookieStore().getCookies(); 

를 사용하여 쿠키 serializeable를 구현하지 않기 때문에, 그 목록을 직렬화 수 없습니다.

편집 :

내 목표는 영구 쿠키와 DefaultHttpClient을 사용하는 것입니다 (내 목표, 문제뿐만 아니라 지정).

나를 올바른 길로 인도 할 수있는 경험이있는 사람은 누구입니까? 내가 발견하지 못한 또 다른 우수 사례가있을 수 있습니다.

답변

6

implements SerializableSerializableCookie 클래스를 만들고 Cookie 속성을 복사하는 중입니다. 다음과 같은 것 :

public class SerializableCookie implements Serializable { 

    private String name; 
    private String path; 
    private String domain; 
    // ... 

    public SerializableCookie(Cookie cookie) { 
     this.name = cookie.getName(); 
     this.path = cookie.getPath(); 
     this.domain = cookie.getDomain(); 
     // ... 
    } 

    public String getName() { 
     return name; 
    } 

    // ... 

} 

모든 속성 자체도 직렬화 가능해야합니다. 프리미티브와는 별도로 String 클래스 자체는 이미 implements Serializable이므로 걱정할 필요가 없습니다.

은 또한 당신은 또한 (가 직렬화하지 않도록)에 Cookietransient A와 속성을 장식/포장 및 writeObject()readObject() 방법 accordingly을 대체 할 수 있습니다. 같은 뭔가 :

public class SerializableCookie implements Serializable { 

    private transient Cookie cookie; 

    public SerializableCookie(Cookie cookie) { 
     this.cookie = cookie; 
    } 

    public Cookie getCookie() { 
     return cookie; 
    } 

    private void writeObject(ObjectOutputStream oos) throws IOException { 
     oos.defaultWriteObject(); 
     oos.writeObject(cookie.getName()); 
     oos.writeObject(cookie.getPath()); 
     oos.writeObject(cookie.getDomain()); 
     // ... 
    } 

    private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { 
     ois.defaultReadObject(); 
     cookie = new Cookie(); 
     cookie.setName((String) ois.readObject()); 
     cookie.setPath((String) ois.readObject()); 
     cookie.setDomain((String) ois.readObject()); 
     // ... 
    } 

} 

마지막으로 대신 List에 그 클래스를 사용합니다.

+0

감사합니다.이 방법이 효과가있을 것이라고 생각하지만 목표를 달성하기위한 더 쉬운 방법이 있기를 바랍니다. SDK에 준비가 된 기능이 있기를 바래서, 바퀴를 다시 발명 할 필요는 없지만 자바 이후로는해야 할 것 같습니다. 영구 쿠키를 사용하는 것이 일반적인 문제입니다. 미안하지만, 내 질문은 처음에는 불분명하다. 그러나 나는 그것을 업데이트했다. 어쨌든, 당신의 제안에 대해 감사드립니다. –

+0

진짜 쿠키를 역 직렬화하는 순간에 유효하지 않을 수있는 상태를 나타내므로 실제 쿠키를 직렬화하지 않는 것이 좋습니다. 그냥 메모리에 보관하거나 이름/값 쌍만 '맵'에 저장하고 대신 직렬화하십시오. – BalusC

+0

아주 좋은 답변을 주셔서 감사합니다. –

2

안드로이드 비동기 HTTP를 라이브러리 된 SharedPreferences에 자동으로 영구 쿠키의 저장을 지원합니다

http://loopj.com/android-async-http/

은 또는 당신은 단지 추출하고 여전히 DefaultHttpClient를 사용하려는 경우 PersistentCookieStore.java 및 SerializableCookie.java 클래스를 사용할 수 있습니다.

관련 문제