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();
}
이 질문은 무엇입니까? 당신이 한 일을 열거하고있는 것처럼 들립니다. 이게 좋은 생각인지 묻는거야? 나는 그렇지 않다고 생각한다. 이 코드는 스레드로부터 안전하지 않습니다. 잠금 만 수행하면 각 스레드가 의도 한 CookieStore 만 볼 수있게됩니다. 할 수 있으면 대신 HttpClient를 사용하는 것이 좋습니다. http://codereview.stackexchange.com/ –
동의하지만이 코드가 스레드로부터 안전하지 않은 이유는 무엇이라고 생각하십니까? – nivs
나는 그것을 잘못 읽었다. 스레딩 문제가 발생하지 않습니다. 내가보기에는 네가 썬의 내부 수업을 참조해야한다는 유일한 단점이있다. 문제가 있습니까? –