我创建了一个服务来注册“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;
}
}
我想在webservice中同时查询多个客户端,但证书不同。
答案 0 :(得分:0)
我要做的是在设置Protocol.registerProtocol和实际的Axis2调用周围添加一个同步块。
synchronized (this) {
Protocol.registerProtocol("https", getHttpsProtocol());
SOAPEnvelope response = call.invoke(request, operationName, messageContext);
return response;
}
这样,当一个线程设置了协议后,其他线程就无法访问和设置协议,直到Axis2调用完成并返回响应为止
希望这会有所帮助