我们正在使用wsdl2java和cxf codegen插件为受ws安全保护的服务创建客户端。
通过自动生成的客户端类(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”时,在调用实际方法“getStaaten”之前,cxf会自动使用用户名和密码(action = http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/SCT)请求SecurityContextToken。从服务中收到SCT后,cxf会存储sct并将其用于下一次调用。
出于某种原因,cxf从不调用http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/SCT/Cancel来终止SCT。我们也无法明确地知道如何明确地执行此操作,我们尝试了几种类似try-with-resource的类,或者获取客户端并调用close方法。
SCT在一定时间后自行过期,不幸的是我们需要在致电该服务后立即关闭它们。
有什么想法吗?
答案 0 :(得分:0)
您可以编写一个简单的拦截器来检索+存储表示已颁发令牌的SecurityToken对象。然后,您可以使用CXF STSClient类显式取消它。其中一些测试可能会对您有所帮助: