我们正在使用 wsdl2java 和 cxf codegen 插件为受 ws-security 保护的服务创建客户端。
通过自动生成的客户端类 (OrganisationsEinheitenCoreService) 调用服务非常简单:
OrganisationsEinheitenCoreService service = new OrganisationsEinheitenCoreService();
IOrganisationsEinheitenCoreService serviceEndpoint = service.getServiceEndpoint();
BindingProvider bindingProvider = (BindingProvider) serviceEndpoint;
Map<String, Object> ctx = bindingProvider.getRequestContext();
ctx.put("ws-security.username", "MyUsername");
ctx.put("ws-security.password", "MyPassword");
ArrayOfStaat staaten = serviceEndpoint.getStaaten();
从服务调用方法“getStaaten”时,cxf 会自动请求带有用户名和密码的 SecurityContextToken(操作 = http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/SCT) ,在调用实际方法“getStaaten”之前。从服务接收到 SCT 后,cxf 存储 sct 并将其用于下一次调用。
出于某种原因,cxf 从不调用http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/SCT/Cancel来终止 SCT。我们也无法弄清楚如何明确地做到这一点,我们尝试了几种方法,比如对类进行 try-with-resource,或者获取客户端并调用 close 方法。
SCT 通常会在一定时间后自行过期,不幸的是我们需要在调用服务后立即关闭它们。
有任何想法吗?