![jax-ws,jax-rs規(guī)范的webservice客戶端調(diào)用方式及soap安全驗證_第1頁](http://file4.renrendoc.com/view/088426e8c61f80703e5f62d273e4867d/088426e8c61f80703e5f62d273e4867d1.gif)
![jax-ws,jax-rs規(guī)范的webservice客戶端調(diào)用方式及soap安全驗證_第2頁](http://file4.renrendoc.com/view/088426e8c61f80703e5f62d273e4867d/088426e8c61f80703e5f62d273e4867d2.gif)
![jax-ws,jax-rs規(guī)范的webservice客戶端調(diào)用方式及soap安全驗證_第3頁](http://file4.renrendoc.com/view/088426e8c61f80703e5f62d273e4867d/088426e8c61f80703e5f62d273e4867d3.gif)
![jax-ws,jax-rs規(guī)范的webservice客戶端調(diào)用方式及soap安全驗證_第4頁](http://file4.renrendoc.com/view/088426e8c61f80703e5f62d273e4867d/088426e8c61f80703e5f62d273e4867d4.gif)
![jax-ws,jax-rs規(guī)范的webservice客戶端調(diào)用方式及soap安全驗證_第5頁](http://file4.renrendoc.com/view/088426e8c61f80703e5f62d273e4867d/088426e8c61f80703e5f62d273e4867d5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、最新jax-ws,jax-rs標準的webservice客戶端調(diào)用方式及soap平安驗證Java調(diào)用webservice方式的總結(jié)柿子當然要拿軟的捏,筆者先講基于 協(xié)議的jax-rs標準的webservice的調(diào)用方式??蛻舳苏{(diào)用WebService的方式: 1.通過wximport生成代碼 2.通過客戶端編程方式同第一種是一樣都是本地調(diào)用 3.通過ajax調(diào)用方式可能存在跨域 jax-rs通過 URL Connection 方式調(diào)用通過 Client方式調(diào)用xfire框架下生成的客戶端不用wximport根據(jù)wsdl文檔生成客戶端代碼,再調(diào)用在eclipse中,根據(jù)操作生成客戶端代碼,Eg:
2、調(diào)用helloWS方法即可客戶單編程方式和第一種方式一樣先生成客戶端代碼后,調(diào)用以下是經(jīng)測試后的實例: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.println(ms.he
3、lloWS(suansuan); catch (MalformedURLException e) e.printStackTrace(); 第二種方式中,還可以直接創(chuàng)立了SOAP消息后使用dispatch便可以進行傳遞,通過extractConentAsDocument方法得到Document類型的返回值使用ajax+xml+js的方式調(diào)用具體使用方法,參考整理的ajax跨域文檔URL Connection方式/效勞的地址 /效勞的地址 URL wsUrl = new URL( :/localhost:88/webServiceWS/wsWSPort); URLConnection conn
4、= ( URLConnection) wsUrl.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestMethod(POST); conn.setRequestProperty(Content-Type, text/xml;charset=UTF-8); OutputStream os = conn.getOutputStream(); /創(chuàng)立SOAPMessage SOAPMessage msg=MessageFactory.newInstance().createMessage();
5、 SOAPEnvelope envelope =msg.getSOAPPart().getEnvelope(); SOAPBody body=envelope.getBody(); /創(chuàng)立QName來指定消息中傳遞數(shù)據(jù) QName ename=new QName( :/ws.webservice.suan/,HelloWS,wsWSService); / SOAPBodyElement ele=body.addBodyElement(ename); ele.addChildElement(arg0).setValue(suansuan); String soap1=soap.toSoapStr
6、ing(msg); os.write(soap1.getBytes(); InputStream is = conn.getInputStream(); byte b = new byte1024; int len = 0; String s = ; 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(); client方式/定義一個PostMethod,這時需要指定
7、web效勞的Url/soapRequestData是傳遞的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,appl
8、ication/soap+xml; charset=utf-8);/不能設置后面的內(nèi)容,設置了報415錯誤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();/返回的字符串形式
9、的soap,進一步解析System.out.println(statusCode);System.out.println(result.toString();xfire框架下生成的客戶端也是通過wsdl生成客戶端程序后調(diào)用,至于soap header的驗證,使用map參加驗證信息后驗證具體的操作,在我工作文檔中,有一個短信平臺接口文檔有詳細的xfire的使用過程,通用性不錯注意,以上關于soap信息,我是根據(jù)生成的本地調(diào)用類的注釋,編寫soap信息,此外可以直接使用String類型的字符串,只要你熟悉soap的格式,就可以手動編寫傳遞的soap消息。Soap協(xié)議的消息 JAX-WS標準是一組X
10、ML web services的JAVA API,在 JAX-WS中,一個遠程調(diào)用可以轉(zhuǎn)換為一個基于XML的協(xié)議例如SOAP,在使用JAX-WS過程中,開發(fā)者不需要編寫任何生成和處理SOAP消息的代碼。JAX-WS的運行時實現(xiàn)會將這些API的調(diào)用轉(zhuǎn)換成為對應的SOAP消息。 JAX-WS 也提供了一組針對底層消息進行操作的API調(diào)用,你可以通過Dispatch 直接使用SOAP消息或XML消息發(fā)送請求或者使用Provider處理SOAP或XML消息。SOAP Header 元素可包含有關 SOAP 消息的應用程序?qū)S眯畔⒈确秸J證、支付等SAAJ構(gòu)建SOAP消息范例:/創(chuàng)立SOAPMessage
11、 SOAPMessage msg=MessageFactory.newInstance().createMessage(); SOAPEnvelope envelope =msg.getSOAPPart().getEnvelope(); QName ename1=new QName( :/ws.webservice.suan/,HelloWS1,wsWSService1); /header的targetspace和方法,入口 SOAPHeader header=msg.getSOAPHeader(); SOAPHeaderElement hele=header.addHeaderElement
12、(ename1); hele.addChildElement(name).setValue(suan); hele.addChildElement(password).setValue(njau1918121); /配置的參數(shù) QName ename=new QName( :/ws.webservice.suan/,HelloWS,wsWSService); SOAPBody body=envelope.getBody(); /創(chuàng)立QName來指定消息中傳遞數(shù)據(jù) / SOAPBodyElement ele=body.addBodyElement(ename); ele.addChildElem
13、ent(arg0).setValue(suansuan); /ele.addChildElement(SecondB).setValue(33); /msg.writeTo(System.out); System.out.println(soap.toSoapString(msg);Soap信息里面的參數(shù)配置:這是本地生成的客戶端信息,targetNamespace,webParam arg0 QName ename=new QName( :/ws.webservice.suan/,HelloWS,wsWSService);這里面的三個數(shù)據(jù),空間,方法名,效勞名 參數(shù)名arg0認識發(fā)布的web
14、serviceCxf框架:其中wsWs是效勞名,Hello是方法名, :/ws.webservice.suan/是定義的目標空間單擊,進入wsdl文檔,其中wsWSImplPort是進入的端口名Jdk自帶框架:目標空間,方法名,端口名,效勞名都在了注,了解發(fā)布的webservice,有助于創(chuàng)立soap信息Webservice的加密的方案舉例(1)對webservice發(fā)布的方法,在入?yún)⒅性黾右粋€或多個字符串序列; 這里的字符串可以要求必須滿足指定的格式,字符串可以再通過客戶端傳參數(shù)的時候加密,效勞端解密;扯點題外話,說起加密解密,我想起了頁面級的自動登錄功能,使用cookie保存密碼,所謂的加
15、密,是為了不讓其他用戶直接看到加密前的密碼,而被直接通過登錄功能登錄。那這一塊接口的字符串加密的意義何在,我本來就是程序調(diào)用接口,不管加密不加密,還是一樣的調(diào)用,又沒有額外的客戶端直接讓你輸未加密密碼驗證的所以,以我現(xiàn)在的理解能力,覺得這個所謂的加密,除了能分辨使用對象之外,毫無平安性可言(2)對webservice發(fā)布的方法,入?yún)⒅屑由嫌脩裘兔艽a,然后效勞端通過數(shù)據(jù)庫校驗;參數(shù)中參加用戶名和密碼,驗證不通過提示非法請求之類的,是一種方法參考網(wǎng)頁: 對webservice發(fā)布的方法,通過handler/chain方式來實現(xiàn)驗證(用戶名&密碼校驗/IP地址校驗等);主要講這種常用的驗證方式參考
16、網(wǎng)頁cxf驗證: :/darrendu.iteye /blog/792236#對webservice發(fā)布的方法,采用webservice的users.lst來進行驗證;對webservice發(fā)布的效勞,通過servlet的Filter來實現(xiàn)驗證;對webservice傳輸過程中的數(shù)據(jù)進行加密;數(shù)據(jù)加密后,在效勞器端解密注:關于axis框架下的兩種驗證方式參考網(wǎng)頁Axis框架下的handler驗證:Axis框架下的users.lst驗證:Webservice的平安機制 Handler驗證機制 WebService有兩種平安機制,一是利用WS-Security將簽名和加密頭參加SOAP消息,另一個
17、是利用數(shù)字證書和數(shù)字簽名認證。此篇文章介紹利用cxf實現(xiàn)WS-Security驗證。 參考網(wǎng)頁 Cxf: :/darrendu.iteye /blog/792236# 效勞器端創(chuàng)立handler步驟,結(jié)合軟件操作,免去注釋的學習本人通過myeclipse操作,只適用cxf框架開發(fā)的jax-ws標準的webservice,在*Impl.java右鍵jax-ws tools-?create jax-ws handler根據(jù)要求填寫相關類,把驗證類所需的handler chain文件,建在webservice包下新建完畢,一個是修改*Impl.java原始的注入路徑有問題Handlers.xml文件
18、內(nèi)容如下: authHandler suan.webservice.ws.AuthValidationHandler 書寫效勞器端驗證類:根據(jù)soap header里面的信息結(jié)構(gòu)分兩種處理方式1.name&password /隨意,可使用name|password,name-password /auth 節(jié)點名稱,可自定義 suan,user.跟body中的結(jié)構(gòu)一致name /arg0 可以自定義password 和 UserOrgID Hubs1 password 先講創(chuàng)立的區(qū)別:QName qname_user=new QName( :/ws.webservice.suan/,auth);
19、/authSOAPHeaderElement helem_user=hdr.addHeaderElement(qname_user);helem_user.addTextNode(admin&admin);QName qname_user=new QName( :/ws.webservice.suan/,authentication);/authSOAPHeaderElement helem_user=hdr.addHeaderElement(qname_user);helem_user.addChildElement(userorgid).setValue(suansuan); helem_
20、user.addChildElement(userid).setValue(*); helem_user.addChildElement(userpsw).setValue(*); 現(xiàn)在講效勞器端處理方式針對第一種:Boolean outbound = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (!outbound.booleanValue() SOAPMessage soapMessage = context.getMessage(); try SOAPEnvelope soapEnvelope =
21、soapMessage.getSOAPPart().getEnvelope();SOAPHeader soapHeader = soapEnvelope.getHeader();if(soapHeader = null)generateSoapFault(soapMessage, No Message Header.);/報錯Iterator it = soapHeader.extractHeaderElements(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT);if(it = null | !it.hasNext()generateSoapFault(soapM
22、essage, 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 blocks);/報錯/value就是獲取到的header中的數(shù)據(jù) catch (SOAPException e) e.printStackTrace(); 第二種:Boolean outboundProp
23、erty = (Boolean) messageContext.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
24、= soapHeader.getChildNodes(); /獲取節(jié)點 for (int i = 0; i nodeList.getLength(); i+) Node nodeAuth = nodeList.item(i); if (nodeAuth.getNodeType() = Node.ELEMENT_NODE & Authentication.equals(nodeAuth.getNodeName() /判斷節(jié)點名稱,可以不判斷,跟第一種一樣 for (Node node = nodeAuth.getFirstChild(); node != null; node = node.ge
25、tNextSibling() 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.getFirstChild() != null) userID = node.getFirstChild().getTextContent
26、(); else if (UserPSW.equals(node.getNodeName() & node.getFirstChild() != null) userPSW = node.getFirstChild().getTextContent(); catch (SOAPException e) log.warn(e); throw new RuntimeException(e); 以下是效勞器端的具體實例,是第一種結(jié)構(gòu)public class AuthValidationHandler implements SOAPHandler public Set getHeaders() / T
27、ODO Auto-generated method stubreturn null;public void close(MessageContext context) public boolean handleFault(SOAPMessageContext context) return false;public boolean handleMessage(SOAPMessageContext context) ServletRequest request = ( ServletRequest)context.get(Abstract Destination. _REQUEST);Syste
28、m.out.println(客戶端IP:+request.getRemoteAddr();Boolean outbound = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (!outbound.booleanValue() SOAPMessage soapMessage = context.getMessage(); try SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();SOAPHeader soapHeader =
29、 soapEnvelope.getHeader();if(soapHeader = null)generateSoapFault(soapMessage, No Message Header.);Iterator it = soapHeader.extractHeaderElements(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT);if(it = null | !it.hasNext()generateSoapFault(soapMessage, No Header block for role next);Node node = (Node)it.next()
30、;String value = node = null ? null : node.getValue();if(value = null)generateSoapFault(soapMessage, No authation info in header blocks);String infos = value.split(&);return authValidate(infos0, infos1); catch (SOAPException e) e.printStackTrace(); return false;private boolean authValidate(String use
31、rName,String password)if(userName = null | password = null)return false;if(admin.equals(userName) & admin.equals(password)return true;return false;private void generateSoapFault(SOAPMessage soapMessage,String reasion)try SOAPBody soapBody = soapMessage.getSOAPBody();SOAPFault soapFault = soapBody.ge
32、tFault();if(soapFault = null)soapFault = soapBody.addFault();soapFault.setFaultString(reasion);throw new SOAPFaultException(soapFault); catch (SOAPException e) / TODO Auto-generated catch blocke.printStackTrace();以下是未通過驗證的報錯:3客戶端soap信息及驗證類的書寫 不管怎樣,還是要回歸客戶端調(diào)用這一塊的。 主要兩個方向,一個是直接客戶端生本錢地調(diào)用,問題是怎么添加header信息頭;另一個就是生成soap信息,通過 client,url connection以及soap dispatch的方式傳遞soap信息。調(diào)用本地客戶端的形式這個需要AuthenticationHandler()類的支持,里面是編寫的soapheader信息具體事例至如下,采用的也是上文的第一種結(jié)構(gòu)public class Authenticat
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年山東公務員考試行測試題
- 2025年太陽能光伏組件安裝服務合同
- 2025年商業(yè)地產(chǎn)租賃協(xié)議深度剖析
- 2025年醫(yī)院食堂食用油采購協(xié)議
- 2025年紫外光固化油墨項目規(guī)劃申請報告
- 2025年互聯(lián)網(wǎng)用戶權(quán)益協(xié)議
- 2025年貨運司機勞動合同
- 2025年腫瘤類生物制品項目提案報告模范
- 2025年保障性住房貸款合同
- 2025年標準個人古董押借款合同樣本
- 輔導員入職培訓課件
- 中建雨季專項施工方案
- 《我國個人所得稅制下稅收征管問題研究》
- 建筑工程三通一平技術方案
- 綠化養(yǎng)護工安全培訓
- DB21-T 1720-2017海水源熱泵系統(tǒng)工程技術規(guī)程
- 組長競選課件教學課件
- 《基于UTAUT2模型的虛擬學術社區(qū)用戶持續(xù)使用意愿影響因素研究》
- 2022年公務員多省聯(lián)考《申論》真題(遼寧A卷)及答案解析
- 2024 ESC慢性冠脈綜合征指南解讀(全)
- 消防設施操作員(初級)題庫與參考答案
評論
0/150
提交評論