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 は一定の時間が経過すると自動的に期限切れになりますが、残念ながら、サービスを呼び出した直後に SCT を閉じる必要があります。
何か案は?