これは私の最初の投稿ですので、しばらくお待ちください。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;
}