Java 與 .NET 的基於 WS-Security的Web Services整合實現(下)

來源:互聯網
上載者:User
services|web Java 與 .NET 的基於 WS-Security的Web Services整合實現(下)

rottenapple

4. 開啟Jbuilder9 ,建立一個java 類,命名為TestNetService。並將axis-wsse-1.0的jar包添加到Jbuilder的jdk中(Tools->configions jdks->class tab->add)代碼如下:

package MyWebServiceJavaClient;

import java.util.Date;

import java.text.DateFormat;

import org.apache.axis.MessageContext;

import org.apache.axis.message.*;

import org.apache.axis.client.*;

import org.apache.axis.utils.*;

import javax.xml.namespace.QName;

import java.lang.Integer;

import javax.xml.rpc.ParameterMode;

import net.vitale.filippo.axis.handlers.WsseClientHandler;

/**

* <p>Title: </p>

* <p>Description: </p>

* <p>Copyright: Copyright (c) 2004</p>

* <p>Company: </p>

* @author not attributable

* @version 1.0

*/



public class TestNetService {

static String usernameS = null;

static String passwordS = null;

public TestNetService() {

}



public static void main(String[] args) {

try {

Integer i = new Integer(2);

Integer j = new Integer(2);

String endpoint="http://localhost/MyServices/WebServiceTest/SumService.asmx";



Service service = new Service();

Call call = (Call)service.createCall();



call.setTargetEndpointAddress(new java.net.URL(endpoint));

call.setOperationName(new QName("http://www.contoso.com/SU","IntAdd"));

call.addParameter("a",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);

call.addParameter("b",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);

call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT);

call.setUseSOAPAction(true);

call.setSOAPActionURI("http://www.contoso.com/Rpc");



//add a user token

usernameS =”username”;

passwordS = "love";

call.setUsername(usernameS);

call.setPassword(passwordS);

call.setProperty(WsseClientHandler.PASSWORD_OPTION, WsseClientHandler.PASSWORD_DIGEST_WITH_NONCE);

call.setClientHandlers(new WsseClientHandler(), null);





Integer k = (Integer)call.invoke(new Object[]{i,j});



System.out.println( "result is " + k.toString() + ".");



}

catch (org.apache.axis.AxisFault e)

{



if (e.getFaultCode().toString() .equals("{http://schemas.xmlsoap.org/ws/2002/07/secext}FailedAuthentication"))

System.err.println("The usernameToken and password aren't right! ");

else {

System.err.println(e.getFaultCode().toString());



}

}

catch(Exception e)

{

System.err.println(e.toString()) ;

}



}



}

5. 編譯並運行這個java程式,執行結果如下:

The username and password aren't right!

可以看到,在Web Services中的PasswordProvider類中,GetPassWord()方法是用來返回相應的密碼。在上面的樣本中,由於username=”usename”,因此GetPassWord返回”password”,而java傳遞過來的密碼是”love”,因此兩者不符合。系統會拋出異常,我們在Java中進行捕獲,並顯示自己的提示資訊。

6. 修改部分Java代碼並運行

將passwordS = "love”;替換成passwordS = "password";重新編譯運行,結果如下:

result is 4.

這樣,可以看到Java用戶端發送的使用者名稱和密碼在Web Services得到了認證,並執行了IntAdd方法,返回正確的計算結果。至此,一個簡單的基於WS-Security的Java 用戶端與.Net Web Services的互連就基本實現了。



四:可擴充的地方

1. Java端的使用者名稱,密碼是可以從UI介面上得到。

2. Java端的密碼傳輸方式用三種,可以自由選擇。

3. Web Service端的密碼可以從資料庫,AD,檔案等處獲得。

4. Web Service端的驗證錯誤後的異常資訊可以自己制定。

5. 可以使用X.509作為認證,添加第三方數位簽章認證(目前asix-wsse1.0沒有實現)

6. 有興趣的朋友可以看看axis-wsse-1.0的原始碼,很簡單,就一個檔案,不過我看起來很費勁,因為調用了很多axis裡面的東西,那個我也不熟悉,所以就看不明白,呵呵。



五:不足之處

1.X.509是包含在WS-Security中的,但是目前沒有基於java的開源實現。IBM的WebSphere有相應的實現。

2.我個人認為這也是基於Web Services的不同平台間相互調用的一個大的問題就是異常的處理。目前我個人覺得好的方法是紀錄到日誌中。如果想捕獲不同系統提供的異常資訊的確是一個困難的事情,不知道誰還有好的方法。我發現在網上介紹Web Services的文章書籍中很少有介紹這方面的東西,也許大家都不熟悉也就不敢亂寫了(出了我之外)。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.