“Web服务”是一种软件系统,旨在通过万维网支持可互操作的机器对机器交互。
为什么 Apache CXF 不尊重 'nil="true"'
我使用 Apache CXF 3.0.2 作为客户端和服务器。服务器上有一个相当简单的 Web 服务,它接受各种参数,其中之一是字符串数组: 我使用 Apache CXF 3.0.2 作为客户端和服务器。服务器上有一个相当简单的 Web 服务,它接受各种参数,其中之一是字符串数组: <xs:complexType name="getThing"> <xs:sequence> <xs:element minOccurs="0" name="connection" type="tns:connectionID"/> <xs:element maxOccurs="unbounded" minOccurs="0" name="types" type="xs:string"/> </xs:sequence> </xs:complexType> 当客户端调用它时,它可能希望为“类型”传递一个空值,这就是我遇到问题的地方。来自客户端的 SOAP 消息如下所示: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns2:getThing xmlns:ns2="http://serverl.url/"> <connection>Connection details....</connection> <types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> </ns2:getThing> </soap:Body> </soap:Envelope> 我认为这是正确的,但是服务器上的 CXF 将其转换为具有单个空字符串值的数组; 不是包含空值的数组。这会导致服务器代码出现各种问题。 服务端实现的接口是这样的? ThingResult getThing(@WebParam(name = "connection") ConnectionID connection, @WebParam(name = "types") String[] types) { code } 如果 'nil="true"' 无效,那么为什么 CXF 会生成它? 空数组可以正常工作(客户端省略消息中的元素,服务器将其解释为空),但包含空值的数组则不行。为什么 CXF 会出现这种情况?如何配置它以便服务器将 SOAP 消息正确反序列化回客户端发送的内容? 我到处寻找答案,并且相当确定我错过了一些非常明显的东西! 编辑:添加代码示例 该模式没有 types 元素的 nillable="true" 属性。 因此,xsi:nil="true" 不是该元素的有效值。 我找不到使 CXF 表现良好的方法(无论是在 WSDL 生成中还是在生成的 WSDL 的客户端方面)。 相反,我必须修改服务器代码以将空值和空字符串视为等效。 一些不需要的黑客攻击,但似乎有效。 steve666 在 Apache Mail Archives 中显示了一种解决方法,其中 SAAJOutInterceptor 用于允许自定义拦截器(即另一个 AbstractSoapInterceptor)根据 的存在来遍历所有元素并删除 nil 元素。 xsi:nil 属性。
我是 magento 2x 的新手。不过,我尝试创建一个自定义模块和一个网络服务来检查客户电子邮件是否存在。但结果我只得到一个空白数组。这是我所拥有的
我正在使用以下代码来获取结果,但由于某种原因我收到此错误:第 1 行错误:序言中不允许内容。 (第 134 行,文件“Code”)在本例中是 变种
因此,对于我的学校项目,我正在制作一个由阅读器应用程序和基于根的词典网络服务组成的系统。它们将通过 REST API 链接。我按照建议遵循 SOA ...
有人可以解释一下 Web 服务和 Web API 之间的区别吗?我浏览了很多博客,但它们似乎都使用相同的书本知识。实际区别是什么
我有一个需要公开 API 的 .NET Windows 服务。我现在在开发过程中使用远程处理。 现在我的所有方法都接受并返回 XML。我已经有很多定制了
如何在asp.net c#和Android中实现UIDAI Aadhar API?
我正在开发需要使用 C#.Net MVC Aadhar 卡身份验证的应用程序。 我已经参考了大部分关于在 C#.Net 中实现 Aadhar 卡 API 的博客,但无法找到合适的解决方案...
如何使用 QNetworkAccessManager 将数据发布到 url
我有一个网络服务,我需要使用 Qt 将一些数据发布到其中。 我认为在发布到 Web 服务时可以使用 QByteArray。 我的问题是,如何格式化这个数组才能符合...
我们遇到这样一种情况:用户向服务器提交 xml 文件,然后检查该文件是否有唯一引用,并将新引用存储在数据库中。 如果他们提交相同的参考文献...
是否有可用的 API,允许我们根据单词的真假/正确与否来发布单词并接收布尔结果?
如何通过 S4HANA 中的 OData Web 服务输入时间表?
我想使用 SAP S/4HANA(2021 版 FP2 SP3 版)中的 OData Web 服务创建时间预订/记录。 我发现 HCM_TIMESHEET_MAN_SRV 作为 OData Web 服务,还可以检索
我正在尝试将 UsernameToken wss 标头添加到我的 ws 客户端。 客户端实现 javax.xml.ws.Service 并已通过 WSDL2Java CFX 3.1.4 生成 由于 wsdl 包含 我正在尝试将 UsernameToken wss 标头添加到我的 ws 客户端。 客户端实现了 javax.xml.ws.Service 并已通过 WSDL2Java CFX 3.1.4 生成 由于 wsdl 包含 <wsp:Policy xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy" wsu:Id="UsernameTokenPolicy"> <sp:UsernameToken> <wsp:Policy> <sp:WssUsernameToken10/> <sp:HashPassword/> </wsp:Policy> </sp:UsernameToken> </wsp:Policy> 必须添加 Usernametoken 标头。搜索了一下,我发现这很简单 ((BindingProvider)soapClient).getRequestContext().put("ws-security.username", usr); ((BindingProvider)soapClient).getRequestContext().put("ws-security.password", psw); 顺便说一下,当我尝试执行呼叫时,出现以下错误: These policy alternatives can not be satisfied: {http://schemas.xmlsoap.org/ws/2005/07/securitypolicy}UsernameToken: Password hashing policy not enforced 有什么建议吗? 谢谢你。 附注我已经在堆栈溢出中检查过类似的帖子,但是如果我尝试像here建议的那样采用不同的方法,我会得到一个不同的错误: Interceptor for XXXX has thrown exception, unwinding now org.apache.cxf.ws.policy.PolicyException: No username available 如cxf-文档所述 从 Apache CXF 3.1.0 开始,WS-SecurityPolicy 和 XML 安全性 CXF 中的 (JAX-RS) 组件共享一组通用的配置标签。 所以你不应该使用ws-security.username和ws-security.password,而应该使用security.username和security.password 还要确保 cxf-rt-ws-policy 和 cxf-rt-ws-security 模块在类路径上可用,以便 ws-policy 将自动启用,从而负责对密码进行哈希处理,即计算正确的密码摘要。
处理标头时发现错误 顺便说一句,这是一个 WS-Security 问题... 我看不出我的 WS 端点有任何问题(除了它在
如何为 Weblogic 实现具有签名正文和时间戳的 Web 服务客户端
我正在尝试为启用了 WSS(签名正文和时间戳)的 Web 服务实现一个简单的 Web 服务客户端。这是 WSS 政策: 我正在尝试为启用了 WSS(签名正文和时间戳)的 Web 服务实现一个简单的 Web 服务客户端。这是 WSS 政策: <wsp:Policy wsu:Id="SignatureRequired" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"> <wsp:ExactlyOne> <wsp:All> <sp:AsymmetricBinding> <wsp:Policy> <sp:InitiatorToken> <wsp:Policy> <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> <wsp:Policy> <sp:WssX509V3Token10 /> </wsp:Policy> </sp:X509Token> </wsp:Policy> </sp:InitiatorToken> <sp:RecipientToken> <wsp:Policy> <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToInitiator"> <wsp:Policy> <sp:WssX509V3Token10 /> </wsp:Policy> </sp:X509Token> </wsp:Policy> </sp:RecipientToken> <sp:AlgorithmSuite> <wsp:Policy> <sp:TripleDesRsa15/> </wsp:Policy> </sp:AlgorithmSuite> <sp:Layout> <wsp:Policy> <sp:Strict /> </wsp:Policy> </sp:Layout> <sp:IncludeTimestamp /> </wsp:Policy> </sp:AsymmetricBinding> <sp:SignedParts> <sp:Body /> </sp:SignedParts> </wsp:All> </wsp:ExactlyOne> </wsp:Policy> 客户端实现基于 Oracle 文档中的示例:http://docs.oracle.com/cd/E24329_01/web.1211/e24488/message.htm#WSSOV273 Web 服务在 Weblogic 12c (12.1.2) 和 Oracle Java 1.7.0_25 上运行 package com.example.testclient.mtom; import weblogic.jws.jaxws.ClientPolicyFeature; import weblogic.jws.jaxws.policy.InputStreamPolicySource; import weblogic.security.SSL.TrustManager; import weblogic.xml.crypto.wss.api.Timestamp; import weblogic.xml.crypto.wss.api.WSSecurityFactory; import weblogic.xml.crypto.wss.provider.CredentialProvider; import weblogic.xml.crypto.wss.WSSecurityContext; import weblogic.wsee.security.bst.ClientBSTCredentialProvider; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import javax.xml.ws.soap.MTOMFeature; import org.apache.commons.lang.RandomStringUtils; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.io.FileInputStream; import java.io.InputStream; import java.security.cert.X509Certificate; import com.example.attachment.TestWebServiceAttachment_Service; import com.example.attachment.TestWebServiceAttachment; public class TestWebServiceAttachmentClient { public TestWebServiceAttachmentClient() { // TODO Auto-generated constructor stub } public static void main(String[] args) throws Throwable { String username = "User"; String password = "Pass"; String clientCertFile = "src/main/resources/User.jks"; QName operationName = new QName("http://www.example.com/ws/attachment", "fileUpload"); MTOMFeature mtomFeature = new MTOMFeature(); InputStream is = new FileInputStream("src/main/resources/my-wssp1.1-signature-required.xml"); ClientPolicyFeature clientPolicyFeature = new ClientPolicyFeature(); clientPolicyFeature.setEffectivePolicyForOperation(operationName, new InputStreamPolicySource(is)); TestWebServiceAttachment_Service service = new TestWebServiceAttachment_Service(); TestWebServiceAttachment port = service.getTestWebServiceAttachmentPort(clientPolicyFeature, mtomFeature); //create credential provider and set it to the Stub List credProviders = new ArrayList(); //client side BinarySecurityToken credential provider -- x509 CredentialProvider cp = new ClientBSTCredentialProvider(clientCertFile, password, username, password); credProviders.add(cp); Date date = new Date(); Calendar created = Calendar.getInstance(); created.setTime(date); Calendar expired = Calendar.getInstance(); expired.setTime(date); expired.set(Calendar.HOUR_OF_DAY, created.get(Calendar.HOUR_OF_DAY) + 1); Timestamp timestamp = WSSecurityFactory.newTimestamp("TS-" + RandomStringUtils.randomNumeric(34), created, expired); Map<String, Object> requestContext = ((BindingProvider) port).getRequestContext(); requestContext.put(WSSConstants.TIMESTAMP_ELEMENT, timestamp); requestContext.put(WSSecurityContext.CREDENTIAL_PROVIDER_LIST, credProviders); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://myserver:7001/ws/TestWebServiceAttachment/1.0"); requestContext.put(WSSecurityContext.TRUST_MANAGER, new TrustManager() { public boolean certificateCallback(X509Certificate[] chain, int validateErr) { // need to validate if the server cert can be trusted return true; } }); DataHandler dh = new DataHandler(new FileDataSource("src/main/resources/file1.pdf")); long response = port.fileUpload("file1.pdf", dh); System.out.println("response = " + response); } } 问题在于时间戳。我不知道如何正确地将时间戳签名添加到 WSS 上下文中。有谁知道如何实现这样的客户端?我收到以下异常: Exception in thread "main" com.sun.xml.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: Timestamp validation failed. Please see the server log to find more detail regarding exact cause of the failure. at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:193) at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:125) at com.sun.xml.ws.client.sei.StubHandler.readResponse(StubHandler.java:253) at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:181) at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:258) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:117) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:91) at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:154) at com.sun.proxy.$Proxy37.fileUpload(Unknown Source) 我知道我的答案可能对你不再有用,但可能对其他人有帮助。 Weblogic 时间戳验证假定相应字段位于 UTC 时区。检查您的日期时间字段是否采用 UTC。 当没有时间戳字段或时间戳字段不正确时,服务器会显示 Timestamp validation failed 消息。您可以通过将以下行添加到代码中来查看您的原始 SOAP 请求: System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true"); System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true"); System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true"); System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump". "true");
当明文密码未存储在 Web 服务生产者上时,PasswordDigest 的替代方案是什么?
场景: Web 服务生产者仅将密码的 SHA-1 哈希值存储在数据库中。我们需要使用用户名/密码组合来验证 Web 服务用户。 Web 服务安全用户名...
我即将开发一个 Windows 应用程序,需要使用 Web 服务安全性与 Axis2 Web 服务进行通信 - 所有文档都说,SOAP 安全通信是
使用soapUI测试WS安全性 - 在消息负载中使用安全标头
我是 Web 服务和 WS Security 的新手。 我有一个使用 CFX 拦截器的示例 Web 服务。以下是我的配置文件。 Cfx-servelet.xml: ...
LoadRunner - WSS 身份验证:编码类型为 Base64 的 Nonce 标签
使用 LoadRunner,我尝试连接一些 Web 服务操作。 我无法通过以下方式进行身份验证: web_service_set_security(SECURITY_TOKEN,“类型=用户名”,“逻辑名称=用户凭据”,“用户名=
如何设置 NodeJS 的 einaros/ws 模块来接受 wss(安全 ws)连接?
我正在使用 NodeJS 的 eniaros/ws 模块,使用 Web 套接字在 iOS 应用程序和 NodeJS 服务器之间进行实时通信。 该应用程序运行良好,但现在我必须确保通信安全......
我正在开展一个项目,需要验证司机的驾驶执照(DL)号码。我已经探索了互联网,但未能找到政府提供的任何官方免费 API...