在 SOAP(轴 2)中使用证书注册协议"https"多线程



>我创建了一个服务来注册"https"协议并使用SocketFactory实现将证书注入其中,一次只有一个请求正常工作,但是使用多线程就像只注册一次,Webservice SOAP就像错误的证书一样。 Web 服务 SOAP 类由 Axis 2 使用从页面保存的 WSDL 生成。

使用证书注册协议的代码:

public boolean sign(InputStream pfx, final String password) throws Exception {
try {
InputStream in = new ByteArrayInputStream(getBytesFromInputStream(pfx));
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(in, password.toCharArray());
in.close();
Enumeration<String> aliases = ks.aliases();
String alias = null;
while (aliases.hasMoreElements()) {
alias = (String) aliases.nextElement();
if (ks.isKeyEntry(alias)) break;
}
X509Certificate certificate = (X509Certificate) ks.getCertificate(alias);
PrivateKey privateKey = (PrivateKey) ks.getKey(alias, password.toCharArray());
SocketFactoryDynamic socketFactoryDinamico = new SocketFactoryDynamic(certificate, privateKey);
socketFactoryDinamico.setFileCacerts("NFeCacerts");
Protocol.registerProtocol("https", new Protocol("https", socketFactoryDinamico, 443));
return true;
} catch (IOException | NoSuchAlgorithmException | CertificateException | KeyStoreException | UnrecoverableKeyException e) {
throw e;
}
}

我想在 Web 服务中同时查询多个客户端,但证书不同。

我所做的是围绕设置Protocol.registerProtocol和实际的Axis2调用添加一个同步块。

synchronized (this) {
Protocol.registerProtocol("https", getHttpsProtocol());
SOAPEnvelope response = call.invoke(request, operationName, messageContext);
return response;
}

这样,当一个线程设置了协议时,其他线程无法访问并设置它,直到 Axis2 调用完成并返回响应

希望这有帮助

最新更新