jax-ws,jax-rs規(guī)范的webservice客戶端調(diào)用方式及soap安全驗(yàn)證_第1頁
jax-ws,jax-rs規(guī)范的webservice客戶端調(diào)用方式及soap安全驗(yàn)證_第2頁
jax-ws,jax-rs規(guī)范的webservice客戶端調(diào)用方式及soap安全驗(yàn)證_第3頁
jax-ws,jax-rs規(guī)范的webservice客戶端調(diào)用方式及soap安全驗(yàn)證_第4頁
jax-ws,jax-rs規(guī)范的webservice客戶端調(diào)用方式及soap安全驗(yàn)證_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Java調(diào)用webservice方式的總結(jié)柿子當(dāng)然要拿軟的捏,筆者先講基于 協(xié)議的jax-rs標(biāo)準(zhǔn)的webservice的調(diào)用方式。客戶端調(diào)用WebService的方式: 1.通過wximport生成代碼 2.通過客戶端編程方式同第一種是一樣都是本地調(diào)用 3.通過ajax調(diào)用方式可能存在跨域 jax-rs4. 通過 URL Connection 方式調(diào)用5. 通過 Client方式調(diào)用6. xfire框架下生成的客戶端不用1. wximport根據(jù)wsdl文檔生成客戶端代碼,再調(diào)用在eclipse中,根據(jù)操作生成客戶端代碼,Eg:調(diào)用helloWS方法即可2. 客戶單編程方式和第一種方式一樣先

2、生成客戶端代碼后,調(diào)用以下是經(jīng)測試后的實(shí)例:URL url = new URL(" :/localhost:88/webServiceWS/wsWSPort?wsdl"); QName sname = new QName(" :/ws.webservice.suan/", "wsWSService"); Service service = Service.create(url,sname); WsWSDelegate ms = service.getPort(WsWSDelegate.class); System.out.printl

3、n(ms.helloWS("suansuan"); catch (MalformedURLException e) e.printStackTrace(); 第二種方式中,還可以直接創(chuàng)建了SOAP消息后使用dispatch便可以進(jìn)行傳遞,通過extractConentAsDocument方法得到Document類型的返回值參考網(wǎng)頁: :/3. 使用ajax+xml+js的方式調(diào)用具體使用方法,參考整理的ajax跨域文檔4. URL Connection方式/服務(wù)的地址 /服務(wù)的地址 URL wsUrl = new URL(" :/localhost:88/webS

4、erviceWS/wsWSPort"); URLConnection conn = ( URLConnection) wsUrl.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); OutputStream os = conn.getOutputStrea

5、m(); /創(chuàng)建SOAPMessage SOAPMessage msg=MessageFactory.newInstance().createMessage(); SOAPEnvelope envelope =msg.getSOAPPart().getEnvelope(); SOAPBody body=envelope.getBody(); /創(chuàng)建QName來指定消息中傳遞數(shù)據(jù) QName ename=new QName(" :/ws.webservice.suan/","HelloWS","wsWSService"); /<n

6、n:add xmlns="xx"/> SOAPBodyElement ele=body.addBodyElement(ename); ele.addChildElement("arg0").setValue("suansuan"); String soap1=soap.toSoapString(msg); os.write(soap1.getBytes(); InputStream is = conn.getInputStream(); byte b = new byte1024; int len = 0; String s =

7、 "" while(len = is.read(b) != -1) String ss = new String(b,0,len,"UTF-8"); s += ss; System.out.println(s); is.close(); os.close(); conn.disconnect();5. client方式需要commons-codec-1.3.jar,commons-logging-1.0.4.jar,commons- client-3.1.jar/定義一個(gè)PostMethod,這時(shí)需要指定web服務(wù)的Url/soapRequestData

8、是傳遞的soap協(xié)議的信息,可以通過soap建立,也可以直接StringPostMethod postMethod =new PostMethod(" :/localhost:88/webServiceWS/wsWSPort");byte b = soapRequestData.getBytes("utf-8");InputStream is = new ByteArrayInputStream(b,0,b.length);/RequestEntity re = new InputStreamRequestEntity(is,b.length,"

9、;application/soap+xml; charset=utf-8");/不能設(shè)置后面的內(nèi)容,設(shè)置了報(bào)415錯(cuò)誤RequestEntity re = new InputStreamRequestEntity(is,b.length);postMethod.setRequestEntity(re); Client Client = new Client();int statusCode = Client.executeMethod(postMethod);/請求狀態(tài) 200 okString result = postMethod.getResponseBodyAsString(

10、);/返回的字符串形式的soap,進(jìn)一步解析System.out.println(statusCode);System.out.println(result.toString();6. xfire框架下生成的客戶端也是通過wsdl生成客戶端程序后調(diào)用,至于soap header的驗(yàn)證,使用map加入驗(yàn)證信息后驗(yàn)證具體的操作,在我工作文檔中,有一個(gè)短信平臺接口文檔有詳細(xì)的xfire的使用過程,通用性不錯(cuò)注意,以上關(guān)于soap信息,我是根據(jù)生成的本地調(diào)用類的注釋,編寫soap信息,此外可以直接使用String類型的字符串,只要你熟悉soap的格式,就可以手動(dòng)編寫傳遞的soap消息。Soap協(xié)議的消

11、息 JAX-WS標(biāo)準(zhǔn)是一組XML web services的JAVA API,在 JAX-WS中,一個(gè)遠(yuǎn)程調(diào)用可以轉(zhuǎn)換為一個(gè)基于XML的協(xié)議例如SOAP,在使用JAX-WS過程中,開發(fā)者不需要編寫任何生成和處理SOAP消息的代碼。JAX-WS的運(yùn)行時(shí)實(shí)現(xiàn)會將這些API的調(diào)用轉(zhuǎn)換成為對應(yīng)的SOAP消息。  JAX-WS 也提供了一組針對底層消息進(jìn)行操作的API調(diào)用,你可以通過Dispatch 直接使用SOAP消息或XML消息發(fā)送請求或者使用Provider處理SOAP或XML消息。SOAP Header 元素可包含有關(guān) SOAP 消息的應(yīng)用程序?qū)S眯畔⒈确秸J(rèn)證、支付等SAAJ構(gòu)建SOA

12、P消息范例:/創(chuàng)建SOAPMessage SOAPMessage msg=MessageFactory.newInstance().createMessage(); SOAPEnvelope envelope =msg.getSOAPPart().getEnvelope(); QName ename1=new QName(" :/ws.webservice.suan/","HelloWS1","wsWSService1"); /header的targetspace和方法,入口 SOAPHeader header=msg.getSOAP

13、Header(); SOAPHeaderElement hele=header.addHeaderElement(ename1); hele.addChildElement("name").setValue("suan"); hele.addChildElement("password").setValue("njau1918121"); /配置的參數(shù) QName ename=new QName(" :/ws.webservice.suan/","HelloWS","

14、;wsWSService"); SOAPBody body=envelope.getBody(); /創(chuàng)建QName來指定消息中傳遞數(shù)據(jù) /<nn:add xmlns="xx"/> SOAPBodyElement ele=body.addBodyElement(ename); ele.addChildElement("arg0").setValue("suansuan"); /ele.addChildElement("SecondB").setValue("33"); /m

15、sg.writeTo(System.out); System.out.println(soap.toSoapString(msg);Soap信息里面的參數(shù)配置:這是本地生成的客戶端信息,targetNamespace,webParam arg0 QName ename=new QName(" :/ws.webservice.suan/","HelloWS","wsWSService");這里面的三個(gè)數(shù)據(jù),空間,方法名,服務(wù)名 參數(shù)名arg0認(rèn)識發(fā)布的webserviceCxf框架:其中wsWs是服務(wù)名,Hello是方法名, :/ws.

16、webservice.suan/是定義的目標(biāo)空間單擊,進(jìn)入wsdl文檔,其中wsWSImplPort是進(jìn)入的端口名Jdk自帶框架:目標(biāo)空間,方法名,端口名,服務(wù)名都在了注,了解發(fā)布的webservice,有助于創(chuàng)建soap信息Webservice的加密的方案舉例(1)對webservice發(fā)布的方法,在入?yún)⒅性黾右粋€(gè)或多個(gè)字符串序列; 這里的字符串可以要求必須滿足指定的格式,字符串可以再通過客戶端傳參數(shù)的時(shí)候加密,服務(wù)端解密;扯點(diǎn)題外話,說起加密解密,我想起了頁面級的自動(dòng)登錄功能,使用cookie保存密碼,所謂的加密,是為了不讓其他用戶直接看到加密前的密碼,而被直接通過登錄功能登錄。那這一塊接

17、口的字符串加密的意義何在,我本來就是程序調(diào)用接口,不管加密不加密,還是一樣的調(diào)用,又沒有額外的客戶端直接讓你輸未加密密碼驗(yàn)證的所以,以我現(xiàn)在的理解能力,覺得這個(gè)所謂的加密,除了能分辨使用對象之外,毫無安全性可言(2)對webservice發(fā)布的方法,入?yún)⒅屑由嫌脩裘兔艽a,然后服務(wù)端通過數(shù)據(jù)庫校驗(yàn);參數(shù)中加入用戶名和密碼,驗(yàn)證不通過提示非法請求之類的,是一種方法參考網(wǎng)頁: :/www blogs /luking/archive/2011/03/04/1970592.html (3) 對webservice發(fā)布的方法,通過handler/chain方式來實(shí)現(xiàn)驗(yàn)證(用戶名&密碼校驗(yàn)/IP地

18、址校驗(yàn)等);主要講這種常用的驗(yàn)證方式參考網(wǎng)頁cxf驗(yàn)證: :/darrendu.iteye /blog/792236#(4) 對webservice發(fā)布的方法,采用webservice的users.lst來進(jìn)行驗(yàn)證;(5) 對webservice發(fā)布的服務(wù),通過servlet的Filter來實(shí)現(xiàn)驗(yàn)證;(6) 對webservice傳輸過程中的數(shù)據(jù)進(jìn)行加密;數(shù)據(jù)加密后,在服務(wù)器端解密注:關(guān)于axis框架下的兩種驗(yàn)證方式參考網(wǎng)頁Axis框架下的handler驗(yàn)證: :/www blogs /java-pan/archive/2012/09/11/webservice_security2.htmlA

19、xis框架下的users.lst驗(yàn)證: :/www blogs /java-pan/archive/2012/09/10/2478263.htmlWebservice的安全機(jī)制 Handler驗(yàn)證機(jī)制 WebService有兩種安全機(jī)制,一是利用WS-Security將簽名和加密頭加入SOAP消息,另一個(gè)是利用數(shù)字證書和數(shù)字簽名認(rèn)證。此篇文章介紹利用cxf實(shí)現(xiàn)WS-Security驗(yàn)證。 參考網(wǎng)頁 Cxf: :/darrendu.iteye /blog/792236# 1. 服務(wù)器端創(chuàng)建handler步驟,結(jié)合軟件操作,免去注釋的學(xué)習(xí)本人通過myeclipse操作,只適用cxf框架開發(fā)的jax

20、-ws標(biāo)準(zhǔn)的webservice,在*Impl.java右鍵jax-ws tools-create jax-ws handler根據(jù)要求填寫相關(guān)類,把驗(yàn)證類所需的handler chain文件,建在webservice包下新建完畢,一個(gè)是修改*Impl.java原始的注入路徑有問題Handlers.xml文件內(nèi)容如下:<handler-chains xmlns=" :/java.sun /xml/ns/javaee" xmlns:xsi=" :/ /2001/XMLSchema-instance" xsi:schemaLocation=

21、" :/java.sun /xml/ns/javaee"> <handler-chain> <handler> <handler-name>authHandler</handler-name> <handler-class>suan.webservice.ws.AuthValidationHandler</handler-class> </handler> </handler-chain></handler-chains>2. 書寫服務(wù)器端驗(yàn)證類:根據(jù)soap

22、header里面的信息結(jié)構(gòu)分兩種處理方式1.<SOAP-ENV:Header><auth xmlns="*namespace" SOAP-ENV:actor=" :/ /2003/05/soap-envelope/role/next">name&password /隨意,可使用name|password,name-password</auth> /auth 節(jié)點(diǎn)名稱,可自定義 suan,user.</SOAP-ENV:Header>2. 跟body中的結(jié)構(gòu)一致<* xmlns:ws

23、WS=" :/ws.webservice.suan/"><arg0>name</arg0> /arg0 可以自定義<arg1>password</arg1> <*>和<soap:header> <authentication> <userorgid></userorgid>UserOrgID <userid></userid>Hubs1 <userpsw></userpsw>password </authen

24、tication></soap:header>先講創(chuàng)建的區(qū)別:QName qname_user=new QName(" :/ws.webservice.suan/","auth");/authSOAPHeaderElement helem_user=hdr.addHeaderElement(qname_user);helem_user.addTextNode("admin&admin");QName qname_user=new QName(" :/ws.webservice.suan/"

25、,"authentication");/authSOAPHeaderElement helem_user=hdr.addHeaderElement(qname_user);helem_user.addChildElement("userorgid").setValue("suansuan"); helem_user.addChildElement("userid").setValue("*"); helem_user.addChildElement("userpsw").se

26、tValue("*"); 現(xiàn)在講服務(wù)器端處理方式針對第一種:Boolean outbound = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (!outbound.booleanValue() SOAPMessage soapMessage = context.getMessage(); try SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();SOAPHeader soapHeader = soap

27、Envelope.getHeader();if(soapHeader = null)generateSoapFault(soapMessage, "No Message Header.");/報(bào)錯(cuò)Iterator it = soapHeader.extractHeaderElements(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT);if(it = null | !it.hasNext()generateSoapFault(soapMessage, "No Header block for role next");/報(bào)錯(cuò)No

28、de node = (Node)it.next();String value = node = null ? null : node.getValue();if(value = null)generateSoapFault(soapMessage, "No authation info in header blocks");/報(bào)錯(cuò)/value就是獲取到的header中的數(shù)據(jù) catch (SOAPException e) e.printStackTrace(); 第二種:Boolean outboundProperty = (Boolean) messageContext.

29、get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (!outboundProperty) / InBound Message String userOrgID = "" String userID = "" String userPSW = "" SOAPMessage message = messageContext.getMessage(); try SOAPHeader soapHeader = message.getSOAPHeader(); NodeList nodeList

30、 = soapHeader.getChildNodes(); /獲取節(jié)點(diǎn) for (int i = 0; i < nodeList.getLength(); i+) Node nodeAuth = nodeList.item(i); if (nodeAuth.getNodeType() = Node.ELEMENT_NODE && "Authentication".equals(nodeAuth.getNodeName() /判斷節(jié)點(diǎn)名稱,可以不判斷,跟第一種一樣 for (Node node = nodeAuth.getFirstChild(); n

31、ode != null; node = node.getNextSibling() if (node.getNodeType() = Node.ELEMENT_NODE) if ("UserOrgID".equals(node.getNodeName() && node.getFirstChild() != null) userOrgID = node.getFirstChild().getTextContent(); else if ("UserID".equals(node.getNodeName() && node.

32、getFirstChild() != null) userID = node.getFirstChild().getTextContent(); else if ("UserPSW".equals(node.getNodeName() && node.getFirstChild() != null) userPSW = node.getFirstChild().getTextContent(); catch (SOAPException e) log.warn(e); throw new RuntimeException(e); 以下是服務(wù)器端的具體實(shí)例,是

33、第一種結(jié)構(gòu)public class AuthValidationHandler implements SOAPHandler<SOAPMessageContext> public Set<QName> getHeaders() / TODO Auto-generated method stubreturn null;public void close(MessageContext context) public boolean handleFault(SOAPMessageContext context) return false;public boolean hand

34、leMessage(SOAPMessageContext context) ServletRequest request = ( ServletRequest)context.get(Abstract Destination. _REQUEST);System.out.println("客戶端IP:"+request.getRemoteAddr();Boolean outbound = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (!outbound.booleanValue() SO

35、APMessage soapMessage = context.getMessage(); try SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();SOAPHeader soapHeader = soapEnvelope.getHeader();if(soapHeader = null)generateSoapFault(soapMessage, "No Message Header.");Iterator it = soapHeader.extractHeaderElements(SO

36、APConstants.URI_SOAP_1_2_ROLE_NEXT);if(it = null | !it.hasNext()generateSoapFault(soapMessage, "No Header block for role next");Node node = (Node)it.next();String value = node = null ? null : node.getValue();if(value = null)generateSoapFault(soapMessage, "No authation info in header b

37、locks");String infos = value.split("&");return authValidate(infos0, infos1); catch (SOAPException e) e.printStackTrace(); return false;private boolean authValidate(String userName,String password)if(userName = null | password = null)return false;if("admin".equals(userNam

38、e) && "admin".equals(password)return true;return false;private void generateSoapFault(SOAPMessage soapMessage,String reasion)try SOAPBody soapBody = soapMessage.getSOAPBody();SOAPFault soapFault = soapBody.getFault();if(soapFault = null)soapFault = soapBody.addFault();soapFault.setFaultString(reasion);throw new SOAPFaultException(soapFault); catch (SOAPException e) / TODO Auto-generated catch blocke.printStackTrace();以下是未通過驗(yàn)證的報(bào)錯(cuò):3客戶端soap信息及驗(yàn)證類的書寫 不管怎樣,還是要回歸客戶端調(diào)用這一塊的。 主要兩個(gè)方向,一個(gè)是直接客戶端生成本地調(diào)用,問題是怎么添加header信息頭;另一個(gè)就是生成soap信息,通過 client,url connection以及soap

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論