我正在Maven工作一个小型的多模块项目.我们使用Web Services将UI与数据库层分开,并且由于jaxws-maven-plugin,我们或多或少地为我们处理了WSDL和WS客户端的创建.(该插件本质上是围绕wsgen和wsimport的包装.)到目前为止一切都很好.
当我尝试将WSIT安全性分层到图片中时,问题就来了.NetBeans允许我轻松生成安全元数据,但是wsimport似乎完全无法处理Basic-auth安全级别之外的任何事情.
这是我们当前在Maven构建期间调用wsimport的不安全方式:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.10</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlUrls>
<wsdlUrl>${basedir}/../WebService/target/jaxws/wsgen/wsdl/WebService.wsdl</wsdlUrl>
</wsdlUrls>
<packageName>com.yourcompany.appname.ws.client</packageName>
<sourceDestDir>${basedir}/src/main/java</sourceDestDir>
<destDir>${basedir}/target/jaxws</destDir>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我尝试过使用xauthFile,xadditionalHeaders,通过args传递javax.xml.ws.security.auth.username和密码.我还尝试从命令行使用wsimport指向Tomcat生成的WSDL,它具有额外的安全信息.但是,似乎没有任何东西可以改变wsimport生成的文件的组成.
所以我想我的问题是,为了获得一个符合WSIT标准的客户端,我是不是完全放弃了Maven和jaxws插件?有没有办法让WSIT客户端自动生成?或者我需要手动生成客户端吗?
如果您需要我在此处撰写的其他信息,请与我们联系.我正在部署到Tomcat,虽然这似乎不是问题,因为Maven似乎很乐意将Metro拉入部署的WAR文件中.
提前致谢!
编辑:经过大量的WSIT游戏,这对我有用.
对于初学者,使用Netbeans生成WSIT客户端.测试它以确保它工作,然后将WSIT配置文件(wsit-client.xml和[您的Web服务名称] .xml)移动到WS客户端项目的META-INF目录.
从安全角度来看,对项目的相关添加是Web服务xml中的标记:
<wsp:Policy wsu:Id="WebPortBindingPolicy">
<wsp:ExactlyOne>
<wsp:All>
<sc:CallbackHandlerConfiguration wspp:visibility="private">
<sc:CallbackHandler default="wsitUser" name="usernameHandler"/>
<sc:CallbackHandler default="changeit" name="passwordHandler"/>
</sc:CallbackHandlerConfiguration>
<sc:TrustStore wspp:visibility="private" location="C:\Apps\apache-tomcat-6.0.24\certs\client-truststore.jks" type="JKS" storepass="changeit" peeralias="xws-security-server"/>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
Run Code Online (Sandbox Code Playgroud)
显然,这里有一些硬编码的依赖项,我们需要在构建期间进行管理.用户,密码,信任库的位置和peeralias都是开发默认值,并且会随着系统从开发转移到测试和生产而改变.我们正在使用一些不同的策略来管理它,但我们可能最终会在Hudson中设置环境变量以构建每个环境.
摆弄一下Maven的jaxws插件的配置.我们生成WSDL作为构建的一部分,因此我们不需要在本地引用它.这是我们的WS客户端目标中的wsimport命令的插件标记:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlUrls>
<wsdlUrl>${basedir}/../WebService/target/jaxws/wsgen/wsdl/WebService.wsdl</wsdlUrl>
</wsdlUrls>
<staleFile>${project.build.directory}/jaxws/stale/WebService.stale</staleFile>
<packageName>com.yourcompany.appname.ws.client</packageName>
<sourceDestDir>${basedir}/src/main/java</sourceDestDir>
<destDir>${basedir}/target/jaxws</destDir>
</configuration>
<id>wsimport-generate-WebService</id>
<phase>generate-sources</phase>
</execution>
</executions>
<dependencies> …Run Code Online (Sandbox Code Playgroud) 我正在使用WSIT/Metro创建一个简单的Web服务.当客户端尝试使用简单的用户名/ passowrd身份验证方案连接时,我在服务器上收到以下错误:
2010.03.31. 19:10:33 com.sun.xml.ws.protocol.soap.MUTube getMisUnderstoodHeaders
INFO: Element not understood={http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security
Run Code Online (Sandbox Code Playgroud)
我不知道如何使WSIT理解安全块.
我从客户端获得的请求:
<?xml version="1.0" encoding="http://www.w3.org/2003/05/soap-envelope" standalone="no"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
soapenv:mustUnderstand="true">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
wsu:Id="UsernameToken-1">
<wsse:Username>admin</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">admin</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
<wsa:To>http://localhost:11122/services/TopJtapiRemoteMethods</wsa:To>
<wsa:MessageID>urn:uuid:D5C576F83D74F761311270055433217</wsa:MessageID>
<wsa:Action>urn:hasCallPolling</wsa:Action>
</soapenv:Header>
<soapenv:Body />
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
服务器的WSDL:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
targetNamespace="http://soapserver.topjtapi.cti.topdesk.com"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:ns="http://soapserver.topjtapi.cti.topdesk.com"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12/">
<wsp:Policy wsu:Id="PasswordAuthPolicy">
<wsp:All>
<sp:SupportingTokens>
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken10 />
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
</wsp:All>
</wsp:Policy>
<wsdl:types>
<!-- ... -->
</wsdl:types>
<wsdl:message name="incomingCallRequest">
<!-- ... -->
</wsdl:message>
<wsdl:portType …Run Code Online (Sandbox Code Playgroud) 我们有一个在Tomcat v7服务器内的JVM(IBM jdk而不是Oracle)上运行的Java应用程序,具有以下属性
使用Metro(带WSIT)版本2.3来调用需要WS-Security和Ws-Reliability规范的.Net SOAP服务并获得此错误
wsdl定义RM断言.
我想知道这个序列号是否可能是服务器已经认为已完成的旧消息,但客户端仍然认为需要重新提交并确认.此时,它会在尝试完成此消息时遇到此问题,并且无法完成其他任何消息
引起:com.sun.xml.ws.rx.rm.runtime.sequence.UnknownSequenceException:WSRM1124:在com.sun.xml中没有使用id [urn:uuid:7b7df40c-0d0c-49ee-aabd-cd37ec8ce79d]注册的序列. ws.rx.rm.runtime.sequence.invm.InVmSequenceManager.getSequence(InVmSequenceManager.java:307)at com.sun.xml.ws.rx.rm.runtime.sequence.invm.InVmSequenceManager.getOutboundSequence(InVmSequenceManager.java:339 )com.sun.xml.ws.rx.rm.runtime.SourceMessageHandler.registerMessage(SourceMessageHandler.java:87)at com.sun.xml.ws.rx.rm.runtime.ClientTube.processRequest(ClientTube.java:191) )com.sun.xml.ws.api.pipe.Fiber .__ doRun(Fiber.java:1136)at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1050)at com. sun.com.ws.api.pipe.Fiber.doRun(Fiber.java:1019)位于com.sun.xml的com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:877).位于com.sun.xml.ws.client.sei的com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:174)中的ws.client.Stub.process(Stub.java:464).在c处的SyncMethodHandler.invoke(SyncMethodHandler.java:108)om.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:91)位于com.sun的com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:154).代理.$ Proxy85.get(未知来源)
Jul-19-2014 15:22:26.581(ajp-bio-8009-exec-4:28)FINER [com.sun.xml.ws.api.pipe.Fiber ___ doRun] engine-Metro/2.3(tags/2.3-7528) ; 2013-04-29T19:34:10 + …