2012-06-10 2 views
8

HttpURLConnection을 사용하여 여러 스레드에서 동시에 웹 사이트에 연결해야했지만 각 연결마다 다른 쿠키를 사용해야했습니다. Java는 글로벌 CookieManager 설정 만 지원하므로 다음과 같은 해킹을 구현했습니다.HttpURLConnection과 Java의 CookieManager를 사용하여 각 연결마다 다른 쿠키를 사용하는 방법

CookieHandler.setDefault(new CookieManager())을 호출하는 대신 각 스레드마다 다른 CookieStore 인스턴스를 사용하는 사용자 지정 CookieHandler을 구현했습니다.이 요청은 각 요청 후에 지워집니다.

나는 이라는 이름의 클래스를 source code에 기반하여 CookieManager으로 만들었습니다.

구성원 변수 cookieJar이 제거되었으며 그 사용법은 getCookieStore()으로 바뀌 었습니다.

다음 코드가 추가되었습니다 모든 요청 후

CookieHandler.setDefault(SessionCookieManager.getInstance()); 

, 현재의 thread의 CookieStore 취소 :

public class SessionCookieManager extends CookieHandler { 
    private final static SessionCookieManager ms_instance = new SessionCookieManager(); 

    public static SessionCookieManager getInstance() { 
     return ms_instance; 
    } 

    private final static ThreadLocal<CookieStore> ms_cookieJars = new ThreadLocal<CookieStore>() { 
     @Override 
     protected synchronized CookieStore initialValue() { return new sun.net.www.protocol.http.InMemoryCookieStore(); } 
    }; 

    public void clear() { 
     getCookieStore().removeAll(); 
    } 

    public CookieStore getCookieStore() { 
     return ms_cookieJars.get(); 
    } 

를 첫 번째 요청하기 전에, 사용자 정의 CookieManager는 전역 기본 CookieHandler로 설정 :

try { 
    ... 
} finally { 
    SessionCookieManager.getInstance().clear(); 
} 
+0

이 질문은 무엇입니까? 당신이 한 일을 열거하고있는 것처럼 들립니다. 이게 좋은 생각인지 묻는거야? 나는 그렇지 않다고 생각한다. 이 코드는 스레드로부터 안전하지 않습니다. 잠금 만 수행하면 각 스레드가 의도 한 CookieStore 만 볼 수있게됩니다. 할 수 있으면 대신 HttpClient를 사용하는 것이 좋습니다. http://codereview.stackexchange.com/ –

+0

동의하지만이 코드가 스레드로부터 안전하지 않은 이유는 무엇이라고 생각하십니까? – nivs

+0

나는 그것을 잘못 읽었다. 스레딩 문제가 발생하지 않습니다. 내가보기에는 네가 썬의 내부 수업을 참조해야한다는 유일한 단점이있다. 문제가 있습니까? –

답변

관련 문제