JAX-WS生成的SSRS客户端存根认证缓存异常问题求助
解决方案:清除SSRS JAX-WS客户端的认证缓存问题
针对你遇到的JAX-WS客户端认证缓存问题(首次正确认证后,修改错误凭据仍能连接),以下是几个可行的解决方案,无需重启服务器:
方案1:直接通过JAX-WS BindingProvider设置认证(推荐)
放弃使用全局Authenticator,改为在每个JAX-WS客户端实例中直接设置用户名密码,确保每次请求使用最新凭据,绕过系统级认证缓存。
代码示例:
ReportingService2010 reportingService2010 = new ReportingService2010(reportServerUrl); ReportingService2010Soap reportingService2010Soap = reportingService2010.getReportingService2010Soap(); // 获取BindingProvider并设置专属认证信息 BindingProvider bindingProvider = (BindingProvider) reportingService2010Soap; Map<String, Object> requestContext = bindingProvider.getRequestContext(); // 覆盖默认认证属性 requestContext.put(BindingProvider.USERNAME_PROPERTY, getUserName()); requestContext.put(BindingProvider.PASSWORD_PROPERTY, getPassword()); // 执行请求 reportingService2010Soap.listChildren(itemPath, isRecursive);
优点:每个客户端实例独立控制凭据,彻底规避缓存问题,无需触碰sun包内部类。
缺点:需要调整现有客户端初始化代码。
方案2:设置系统属性禁用/控制认证缓存
通过JVM系统属性sun.net.http.auth.cachePolicy控制认证缓存行为,可通过启动参数或代码动态设置:
方式A:JVM启动参数
添加以下参数到JVM启动命令:
-Dsun.net.http.auth.cachePolicy=2
参数说明:
0:默认值,缓存认证凭据1:缓存但每次请求重新验证2:完全禁用缓存
方式B:代码中动态设置
在应用启动或请求执行前设置:
System.setProperty("sun.net.http.auth.cachePolicy", "2");
优点:无需修改客户端核心代码,全局生效。
缺点:影响所有使用HttpURLConnection的请求,可能降低其他请求的性能。
方案3:通过反射清除认证缓存(备选)
如果必须保留全局Authenticator,可通过反射访问sun包的AuthCacheImpl清除缓存(JDK11下虽限制直接访问,但反射仍可生效):
代码示例:
import java.lang.reflect.Method; public void clearAuthCache() { try { // 获取AuthCacheImpl类 Class<?> authCacheImplClass = Class.forName("sun.net.www.protocol.http.AuthCacheImpl"); // 获取默认缓存实例 Method getDefaultMethod = authCacheImplClass.getMethod("getDefault"); Object authCache = getDefaultMethod.invoke(null); // 调用clear方法清空缓存 Method clearMethod = authCacheImplClass.getMethod("clear"); clearMethod.invoke(authCache); } catch (Exception e) { e.printStackTrace(); } }
在修改凭据后或执行请求前调用clearAuthCache()即可清空缓存。
优点:无需调整原有认证逻辑。
缺点:依赖sun包内部实现,未来JDK版本可能失效,存在兼容性风险。
方案4:替换JAX-WS的HTTP传输为Apache HttpClient
通过自定义JAX-WS传输层,使用Apache HttpClient替代默认的HttpURLConnection,完全掌控认证逻辑与缓存策略:
- 添加Apache HttpClient相关依赖(如
org.apache.httpcomponents:httpclient) - 配置JAX-WS使用HttpClient传输(可借助
org.jvnet.jax-ws-commons:httpclient-transport等现成库简化配置)
优点:完全掌控HTTP请求的认证与缓存规则,灵活性极高。
缺点:需要引入额外依赖,配置相对复杂。
内容的提问来源于stack exchange,提问作者bounty_killer525
相关产品推荐
相关产品推荐

