在我的代码中,我同时在不同的线程中执行不同的HTTP请求。 我注意到每个线程在同一个Cookie管理器中写入/读取混合cookie会导致奇怪的行为(例如,在一个线程中使用某些凭据登录,我在其他线程中看到相同的用户信息)。
我使用这个CookieStore实现尝试了一个独立于线程的解决方案:
public class ThreadLocalCookieStore implements CookieStore {
private final static ThreadLocal<CookieStore> ms_cookieJars = new ThreadLocal<CookieStore>() {
@Override
protected synchronized CookieStore initialValue() {
return (new CookieManager()).getCookieStore(); /* InMemoryCookieStore */
}
};
public void add(URI uri, HttpCookie cookie) {
ms_cookieJars.get().add(uri, cookie);
}
public List<HttpCookie> get(URI uri) {
return ms_cookieJars.get().get(uri);
}
@Override
public List<HttpCookie> getCookies() {
return ms_cookieJars.get().getCookies();
}
@Override
public List<URI> getURIs() {
return ms_cookieJars.get().getURIs();
}
@Override
public boolean remove(URI uri, HttpCookie cookie) {
return ms_cookieJars.get().remove(uri, cookie);
}
@Override
public boolean removeAll() {
return ms_cookieJars.get().removeAll();
}
}
然后我在任何线程启动之前调用它
CookieHandler.setDefault(new CookieManager(new ThreadLocalCookieStore(), CookiePolicy.ACCEPT_ALL));
但没有改变,我看到一个线程中的cookie与其他线程cookie混合。
我该如何解决这个问题?我在哪里做错了?