5

目前,我正在与 Sun 课堂上的一个错误作斗争java.net.Authenticator。似乎Authenticator该类具有系统范围的 static Authenticator。这导致我的多线程应用程序出现以下问题。

  1. 线程 1 - 为用户 1 进行身份验证
  2. 线程 2 - 为用户 2 进行身份验证
  3. 线程 1 - 执行代码为用户 1 下载消息

此时,系统将获取用户 2 的消息,而不是用户 1 的消息。

我已经尝试寻找解决方案。许多人建议尝试以下代码:

AuthCacheValue.setAuthCache(new AuthCacheImpl());
Authenticator.setDefault(exchangeAuthenticator);

但是,这对我不起作用,因为我的应用程序是多线程的(exchangeAuthenticator将始终设置为在最新线程中初始化的身份验证器)。

如果有人有任何想法,即使是 hack 目前也会这样做,我真的很感激,因为目前唯一的“整洁”解决方案是synchronized在主要执行方法上放置一个对性能产生巨大影响的方法。

4

1 回答 1

7

根据我的经验,最好的办法是放弃内置的 http 支持并获得Apache 的 HttpClient

如果这不是一个选项,请创建一个扩展 Authenticator 的单个对象,但将用户名和密码存储在ThreadLocal实例中。这样每个线程都可以检索它自己的值。

于 2010-10-08T17:24:06.733 回答