在SOAP中注册协议“https”多线程和请求证书(轴2)

时间:2018-06-15 13:07:46

标签: java multithreading soap https axis2

我创建了一个服务来注册“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中同时查询多个客户端,但证书不同。

1 个答案:

答案 0 :(得分:0)

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

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

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

希望这会有所帮助