java - 使用 SOAP 中请求的证书注册协议(protocol) "https"多线程(轴 2)

标签 java multithreading soap https apache-axis

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

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

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中同时查询多个客户端,但是证书不同。

最佳答案

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

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

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

希望这有帮助

关于java - 使用 SOAP 中请求的证书注册协议(protocol) "https"多线程(轴 2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50876290/

相关文章:

java - PayPal 的未知主机异常

iphone - iOS 应用程序 - 如何每 60 秒检查一次服务器更新?

iOS - 应用程序界面在网络调用期间启动时卡住

java - 如何使用java代码修改SOAP响应?

java - 如何使用模拟测试基于 SOAP 的应用程序?

java - 在 Tomcat 服务器上托管 java servlet

java - 从位图中获取 uri

java - 通过 Logback 记录到 App Engine request_log

java - Java中的同步方法和同步块(synchronized block)有什么区别?

java - cxf-rt-frontend-jaxws 的 Maven 依赖项破坏了现有的 SOAP 客户端