2

これは私の最初の投稿ですので、しばらくお待ちください。WSDL があり、SOAP UI を使用して Java クライアントを生成しました。クライアントをテスト プロジェクトに接続し、クライアントを使用して Web サービスにアクセスしています。Web サービスはセキュリティ ヘッダー (wsdl ポリシーの一部ではない) を想定しているため、作成された SOAP エンベロープにセキュリティ ヘッダーを追加するためにハンドラーを使用する必要がありました。私のプログラムを実行すると、次のエラーがスローされます... SOAP UI を介して同じ SOAP 要求を実行すると、正常に処理されているようです。私が気付いたもう 1 つの興味深い点は、クライアントで処理した後 (エラーがスローされた後)、SOAP UI で同じ要求 (セキュリティ ヘッダーの nonce を含む) を実行しても、正常に処理されているように見えることです。しかし、SOAP UI で同じ要求を 2 回実行しようとすると、同じ Nonce 値を複数回使用できないという例外がスローされます (これは予期される動作です)。これは、クライアントを実行した後に生成されたエラーが、Web サービスを実行しているサーバーに到達していないと考えさせます。そうしないと、nonce がそこにキャッシュされ、SOAP UI で実行できなくなります。Error ブロックの下に Handler クラス メソッドを追加しました。メッセージは SOAP UI で適切に処理されるため、セキュリティ ヘッダーは問題ないと考えがちです。どんな助けでも大歓迎です。これは、クライアントを実行した後に生成されたエラーが、Web サービスを実行しているサーバーに到達していないと考えさせます。そうしないと、nonce がそこにキャッシュされ、SOAP UI で実行できなくなります。Error ブロックの下に Handler クラス メソッドを追加しました。メッセージは SOAP UI で適切に処理されるため、セキュリティ ヘッダーは問題ないと考えがちです。どんな助けでも大歓迎です。これは、クライアントを実行した後に生成されたエラーが、Web サービスを実行しているサーバーに到達していないと考えさせます。そうしないと、nonce がそこにキャッシュされ、SOAP UI で実行できなくなります。Error ブロックの下に Handler クラス メソッドを追加しました。メッセージは SOAP UI で適切に処理されるため、セキュリティ ヘッダーは問題ないと考えがちです。どんな助けでも大歓迎です。

javax.xml.ws.soap.SOAPFaultException: MustUnderstand ヘッダ:[{ http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] は com.sun.xml.internal.ws.protocol.soap.MUTube.createMUSOAPFaultException(不明なソース) で理解されていません com.sun.xml.internal.ws.protocol.soap.ClientMUTube.processResponse(不明なソース) com.sun.xml.internal.ws.api.pipe.Fiber.__doRun (不明なソース) で com.sun.xml.internal.ws.api.pipe.Fiber._doRun (不明なソース) で com.sun.xml .internal.ws.api.pipe.Fiber.doRun (不明なソース) com.sun.xml.internal.ws.api.pipe.Fiber.runSync (不明なソース) com.sun.xml.internal.ws.client .Stub.process (不明なソース) com.sun.xml.internal.ws.client.sei.SEIStub.doProcess (不明なソース) com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(不明)ソース) com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke (ソース不明) com.sun.xml.internal.ws.client.sei.SEIStub.com.sun.proxy.$Proxy34.searchDemographics (提供元不明) での呼び出し (提供元不明) com.douglas.client.Client.main (Client.java:50) での呼び出し

public boolean handleMessage(SOAPMessageContext smc) {

    Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

    if (outboundProperty.booleanValue()) {

        SOAPMessage message = smc.getMessage();


        try {
             //message.writeTo(System.out);
             //System.out.println("\n");
            String nonce = getNonce();
            String password1 = "password01";
            SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
            String messageCrTime = ft.format(new Date());
            String passwordDigest = SHAsum(nonce, password1, messageCrTime);

            SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
            SOAPHeader header = envelope.addHeader();

            SOAPElement security =
                    header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

            SOAPElement usernameToken =
                    security.addChildElement("UsernameToken", "wsse");
            usernameToken.addAttribute(new QName("xmlns:wsu"), "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");

            SOAPElement username =
                    usernameToken.addChildElement("Username", "wsse");
            username.addTextNode("USERNAME");

            SOAPElement password =
                    usernameToken.addChildElement("Password", "wsse");
            password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
           password.addTextNode(passwordDigest);

           SOAPElement nonceElem =
                   usernameToken.addChildElement("Nonce", "wsse");
           //password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
           nonceElem.addTextNode(Base64.encodeBytes(nonce.getBytes()));

           SOAPElement created =
                   usernameToken.addChildElement("Created", "wsu");
           //password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
           created.addTextNode(messageCrTime);

            //Print out the outbound SOAP message to System.out
            message.writeTo(System.out);
            System.out.println("");

        } catch (Exception e) {
            e.printStackTrace();
        }

    } else {
        try {

            //This handler does nothing with the response from the Web Service so
            //we just print out the SOAP message.
            SOAPMessage message = smc.getMessage();
            message.writeTo(System.out);
            System.out.println("");

        } catch (Exception ex) {
            ex.printStackTrace();
        } 
    }


    return outboundProperty;

}
4

1 に答える 1