<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    當(dāng)柳上原的風(fēng)吹向天際的時(shí)候...

    真正的快樂(lè)來(lái)源于創(chuàng)造

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

    #

    注:下例僅為學(xué)習(xí)使用,高性能的服務(wù)器例子請(qǐng)采用NIO方案。

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Scanner;

    public class ThreadedServer{
        
    public static void main(String[] args) throws IOException{
            ServerSocket s
    =new ServerSocket(9999);
            
            
    while(true){
                Socket incoming
    =s.accept();
                InetAddress address
    =incoming.getInetAddress();
                System.out.println(
    "開(kāi)始與"+address+"進(jìn)行通訊.");
                
                
    new Thread(new EchoHandler(incoming)).start();
            }
        }
    }

    class EchoHandler implements Runnable{
        
    private Socket incoming;
        
        
    public EchoHandler(Socket incoming){
            
    this.incoming=incoming;
        }
        
        
        
    public void run(){
            
    try{
                InputStream  inStram
    =incoming.getInputStream();
                OutputStream outStream
    =incoming.getOutputStream();
                
                Scanner in
    =new Scanner(inStram);
                PrintWriter out
    =new PrintWriter(outStream);
                out.println(
    "你好!輸入Bye退出。");
                
                
    while(in.hasNextLine()){
                    String line
    =in.nextLine();
                    System.out.println(
    "客戶端說(shuō):"+line);
                    
                    
    if(line.equalsIgnoreCase("Bye")){
                        
    break;
                    }
                    
    else if(line.equalsIgnoreCase("login")){
                        System.out.println(
    "客戶端想登錄");
                    }
                    
    else if(line.equalsIgnoreCase("register")){
                        System.out.println(
    "客戶端想注冊(cè)");                
                    }
                    
    else if(line.equalsIgnoreCase("dispacth")){
                        System.out.println(
    "客戶端想轉(zhuǎn)發(fā)信息");
                    }
                    
    else if(line.equalsIgnoreCase("userlist")){
                        System.out.println(
    "客戶端想得到用戶列表");
                    }
                    
    else{
                        out.println(
    "收到:"+line);
                    }
                }
            }
            
    catch(Exception ex){
                ex.printStackTrace();
            }
            
    finally{
                
    try {
                    incoming.close();
                } 
    catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    可采用Telnet與上述服務(wù)器端通信,Vista上Telnet可如下方式開(kāi)啟:
    1、打開(kāi)控制面板;
    2、在左側(cè)選擇“經(jīng)典視圖”,然后在右側(cè)選擇“程序和功能”;
    3、在出現(xiàn)的“程序和功能”窗口左側(cè)中點(diǎn)擊“打開(kāi)或關(guān)閉Windows功能”;
    4、在彈出的“Windows功能”窗口中勾選上“Telnet客戶端”;
    5、確定后退出,Windows會(huì)自動(dòng)開(kāi)始配置激活;
    6、在“開(kāi)始搜索”框中輸入“telnet 127.0.0.1 9999



    posted @ 2010-12-23 14:19 何楊 閱讀(463) | 評(píng)論 (0)編輯 收藏

    一.嗅探器的應(yīng)用范圍
       嗅探器要求監(jiān)聽(tīng)設(shè)備的物理傳輸介質(zhì)與被監(jiān)聽(tīng)設(shè)備的物理傳輸介質(zhì)存在直接聯(lián)系或者數(shù)據(jù)包能通過(guò)路由選擇到達(dá)對(duì)方,及一個(gè)邏輯上的三方連接,具體來(lái)說(shuō)有以下兩種情況:
       1.監(jiān)聽(tīng)方與通訊方位于同一物理網(wǎng)絡(luò),如局域網(wǎng)。
       2.監(jiān)聽(tīng)方和通訊方存在路由或者接口關(guān)系,如通訊雙方的同一網(wǎng)關(guān),連接通訊雙方的路由設(shè)備等。
       因此,嗅探技術(shù)不太可能在公共網(wǎng)絡(luò)設(shè)備上使用,當(dāng)今最普遍的嗅探行為多發(fā)生在大大小小的局域網(wǎng)中。

    二.發(fā)生在交換式局域網(wǎng)內(nèi)的竊聽(tīng)
       交換式局域網(wǎng)內(nèi)的網(wǎng)絡(luò)連接設(shè)備是交換機(jī),它連接的每臺(tái)計(jì)算機(jī)是獨(dú)立的,交換機(jī)引入了端口的概念,它會(huì)產(chǎn)生一個(gè)地址表存放每臺(tái)與之連接的計(jì)算機(jī)的MAC地址,除了聲明為廣播或者組播的報(bào)文,交換機(jī)在一般情況下是不會(huì)讓其他報(bào)文出現(xiàn)共享式局域網(wǎng)那樣的廣播形式發(fā)送,因此即使網(wǎng)卡設(shè)置為混雜模式,它也接收不到發(fā)往其他計(jì)算機(jī)的數(shù)據(jù),因?yàn)閿?shù)據(jù)的目標(biāo)地址會(huì)在交換機(jī)中被識(shí)別,然后有針對(duì)性的發(fā)往表中對(duì)應(yīng)地址的端口。
        在這種環(huán)境中,嗅探器為了監(jiān)聽(tīng)特定計(jì)算機(jī)的通訊,通常采取ARP欺騙行為,這時(shí)嗅探器充當(dāng)了一個(gè)被監(jiān)聽(tīng)對(duì)象與信息交換對(duì)象之間的轉(zhuǎn)發(fā)者的角色,它會(huì)截獲雙方發(fā)給對(duì)方的信息后經(jīng)過(guò)處理在發(fā)送給目的方,這時(shí)嗅探器對(duì)雙方是透明的。



    posted @ 2010-12-16 20:56 何楊 閱讀(334) | 評(píng)論 (0)編輯 收藏

    注:下文涉及一種Web入侵方式的古老方法,即利用Cookie冒充已登錄用戶。熟知此方法的朋友請(qǐng)退散。

    我們?cè)谧鯳eb應(yīng)用時(shí),習(xí)慣把用戶信息放到Session中,而這一舉措,實(shí)際上有較大的潛在危險(xiǎn)性,如果別人知道了我們的session id,就可能利用它以我們的身份進(jìn)入Web應(yīng)用。因?yàn)閟ession的數(shù)據(jù)雖然存在于服務(wù)器中,但識(shí)別客戶端各自的數(shù)據(jù)還是靠存放在客戶端的session Id的,如果有人以某個(gè)已登錄的用戶的session Id進(jìn)入Web應(yīng)用,那么他就會(huì)被當(dāng)作那個(gè)用戶,下文將展示這一過(guò)程。

    首先,我們讓某個(gè)用戶正常登錄一個(gè)位于Tomcat上的應(yīng)用,注意右上角的用戶名的顯示:



    再取得他的session Id。這一步實(shí)際上有很多途徑取到,比如url中有時(shí)帶有它,Struts做前端的e
    Web應(yīng)用就時(shí)??梢?jiàn);本地cookie中可以找到它,這個(gè)用程序就能知道,用js也行(使用document.cookie);用嗅探器也可以獲得它,這個(gè)嗅探器可以放在想冒充用戶的機(jī)器或是網(wǎng)關(guān)上。下面使用了TCPMon得到其session id(具體使用方法請(qǐng)參考 http://m.tkk7.com/heyang/archive/2010/12/10/340294.html)。

    上面高亮的文字部分就是“關(guān)羽”這個(gè)用戶的session id。

    現(xiàn)在,url “http://localhost:8080/ProjectManager/GotoModifyUserPage.do” 和session id“4DC291FC36B2392BE440F70E5B3AA49D” 我們已經(jīng)得到,接下來(lái)就是用它們來(lái)進(jìn)入web應(yīng)用了。

    一般的瀏覽器沒(méi)有可供輸入 session id的地方,但從原理來(lái)看我們知道這并不復(fù)雜,因?yàn)閔ttp是基于文本的,只要有工具能把Url和cookie捏合起來(lái)成文本并發(fā)送就可以了,WebTool就是這樣的一款工具,你可以從http://www.hackline.net/a/soft/tools/2010/0603/4198.html  來(lái)獲得它。

    得到下載文件解開(kāi)包,執(zhí)行里面的WebTool 4.2.exe,點(diǎn)擊其菜單“設(shè)置”-->“自定義cookie瀏覽”,使其成為勾選狀態(tài),然后在地址欄輸入http://localhost:8080/ProjectManager/GotoModifyUserPage.do,左下方的cookie處輸入4DC291FC36B2392BE440F70E5B3AA49D,然后點(diǎn)擊右上方的“Get”按鈕,你將看到以下畫(huà)面:


    好了,看看其右上方把,用戶名“關(guān)羽”已經(jīng)顯示出來(lái)了。我們這會(huì)不用得知關(guān)羽的密碼也能以他的身份開(kāi)始操作了,這就是冒充session id做到的。

    好了,感謝您看到這里??梢?jiàn),常規(guī)Web應(yīng)用還是比較脆弱的,但這種入侵方式也好防范,將協(xié)議改成改成https就可以了(請(qǐng)參考 http://m.tkk7.com/heyang/archive/2010/12/13/340500.html)。另希望有人不要把上文的技巧用到不該用的地方,去動(dòng)本不該屬于自己的東西是危險(xiǎn)而徒勞的。
    posted @ 2010-12-14 17:14 何楊 閱讀(2106) | 評(píng)論 (0)編輯 收藏

    注:以下文字還是老調(diào)重彈,對(duì)在Tomcat上配置https熟悉的朋友就不要浪費(fèi)時(shí)間了,另喜歡英語(yǔ)的朋友請(qǐng)直接到https://localhost:8443/docs/ssl-howto.html或是http://localhost:8080/docs/ssl-howto.html查看原文檔。

    給Tomcat配置https只有簡(jiǎn)單的幾個(gè)步驟,比較容易完成的:
    1.首先,用keytool工具生成證書(shū)。
      keytool工具是jdk自帶的,您可以從JAVA_HOME/bin下找到它。
      在命令行Command中,您可以輸入以下命令來(lái)生成認(rèn)證證書(shū):
      C:\jdk1.6.0_13\bin>keytool -genkey -alias tomcat -keyalg RSA -keystore c:\tomcat.keystore
      注意上方命令兩個(gè)加粗的文字,前者是我的JAVA_HOME/bin,后者是證書(shū)的文件名,您需要根據(jù)您的實(shí)際情況進(jìn)行調(diào)整。

    2.輸入必要的數(shù)據(jù)。
      在命令行窗口輸入上面的指令后,控制臺(tái)還會(huì)詢問(wèn)您一些信息如名字,城市,國(guó)家等,這些隨便寫(xiě)就成了,但有一個(gè)地方不能胡來(lái),就是密碼。注意它最要和Tomcat的admin用戶登錄密碼保持一致,也就是說(shuō)問(wèn)你輸入密碼的時(shí)候你要使用Tomcat的admin的密碼(我自己的是123456,如果不記得了請(qǐng)查看您的TOMCAT_HOME/conf/tomcat-users.xml文件)。最后,當(dāng)控制臺(tái)問(wèn)你是否要和Tomcat的admin是一個(gè)密碼時(shí),回車即可。

    3.修改Tomcat配置文件Server.xml
    如果以上手續(xù)成功,那么c:\tomcat.keystore將會(huì)被生成,接下來(lái)修改TOMCAT_HOME/conf/server.xml,找到<Connector ...    port="8443".../>這樣一段,將它替換成下面的文字:
    <Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
               port
    ="8443" minSpareThreads="5" maxSpareThreads="75"
               enableLookups
    ="true" disableUploadTimeout="true" 
               acceptCount
    ="100"  maxThreads="200"
               scheme
    ="https" secure="true" SSLEnabled="true"
               keystoreFile
    ="c:/tomcat.keystore" keystorePass="123456"
               clientAuth
    ="false" sslProtocol="TLS"/>
    注意上述文字的粗體部分,請(qǐng)和您自己設(shè)定的文件及密碼保持一致。

    4.重啟Tomcat,再以https://localhost:8443來(lái)訪問(wèn)Tomcat。
      注意Tomcat也有不聽(tīng)話的時(shí)候,有時(shí)需要重啟一下計(jì)算機(jī)。
     
    好了,就是這些,感謝您看到這里。

    posted @ 2010-12-13 13:52 何楊 閱讀(619) | 評(píng)論 (0)編輯 收藏

    以下文字只是記錄我做的一個(gè)小實(shí)驗(yàn),沒(méi)有代碼和程序,沒(méi)有興趣者請(qǐng)退散。

    在“用TCPMon驗(yàn)證Web應(yīng)用的安全性隱患”中談到,http基本就是明碼,如果用嗅探器獲得http數(shù)據(jù)包的話,甚多私密信息都被被截獲,下面將記錄這一過(guò)程。
    下文中提到的嗅探器是Wireshark,這是一個(gè)優(yōu)秀的免費(fèi)軟件,您可以從 wireshark官方網(wǎng)站 得到它。
    下文中涉及的站點(diǎn)是天涯的用戶登錄頁(yè)面(http://passport.tianya.cn/login.jsp),下面實(shí)驗(yàn)中要用到已經(jīng)注冊(cè)的用戶名test_user2010及其密碼t123456  .


    首先,我們要知道本機(jī)的IP地址和點(diǎn)擊登錄頁(yè)面的登錄按鈕后要向他發(fā)出http請(qǐng)求的機(jī)器的ip地址,前者用ipconfig就能知道,后者的話需要打開(kāi)網(wǎng)頁(yè)源碼獲取響應(yīng)服務(wù)器的網(wǎng)址,再用ping獲得其IP地址。請(qǐng)參考下圖:
    打開(kāi)網(wǎng)頁(yè)源碼獲取響應(yīng)服務(wù)器的網(wǎng)址:


    再用ping獲得其IP地址:


    到這里,我們知道當(dāng)我們?cè)诘卿涰?yè)面輸入用戶名和密碼后,本機(jī)192.168.104.173將和221.11.172.202取得聯(lián)系。

    第二步,我們打開(kāi)Wireshark,讓它開(kāi)始監(jiān)聽(tīng)網(wǎng)絡(luò)數(shù)據(jù)包,當(dāng)我們點(diǎn)擊登錄按鈕并登錄成功后再停止監(jiān)聽(tīng)。

    第三步,我們可以從Wireshark的監(jiān)聽(tīng)結(jié)果中去找想要的數(shù)據(jù),為了減小范圍,我們可以在filter中輸入ip.src==192.168.104.173  && http,它表示IP來(lái)源是本機(jī)IP,使用的協(xié)議是http,下面是找到的結(jié)果:


    在infor一列中,書(shū)寫(xiě)有POST /login http/1.1 (application .....)的一行就是點(diǎn)擊登錄按鈕后發(fā)出的http請(qǐng)求,這一行在上圖中用藍(lán)色框框起來(lái)了。

    點(diǎn)擊這一行,彈出的界面中已經(jīng)把我們輸入的用戶名和密碼都暴露出來(lái)了,上圖中用紅色框表示。

    好了,到這里實(shí)驗(yàn)就做完了,它表示以Http為基礎(chǔ)的Web世界并不安全,用戶名和密碼不足以保護(hù)您的私密信息,所以,很多網(wǎng)站也需要加強(qiáng)安全措施,您自己也盡量不要把隱私信息放到網(wǎng)上。

    最后感謝您看完此文。

    附:2010年12月24日的截圖



    posted @ 2010-12-11 14:19 何楊 閱讀(52908) | 評(píng)論 (16)編輯 收藏

    很簡(jiǎn)單,程序如下:
    class Test{
        
    public static void main(String[] args) throws Exception{
            
    // 漢字變成UFT8編碼
            System.out.println(URLEncoder.encode("何楊""utf-8"));
            
            
    // 將UFT8編碼的文字還原成漢字
            System.out.println(URLDecoder.decode("%E4%BD%95%E6%9D%A8""utf-8"));        
        }
    }

    輸出如下:
    %E4%BD%95%E6%9D%A8
    何楊

    下面是一個(gè)輔助的工具類:
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.net.URLEncoder;


    /**
     * UTF8轉(zhuǎn)碼器
     * 
    @author heyang
     *
     
    */
    public class UTF8Coder{
        
    private static final String UTF_8 = "utf-8";// 編碼形式

        
    /**
         * 對(duì)文字進(jìn)行UTF8轉(zhuǎn)碼
         * 
    @param str
         * 
    @return
         
    */
        
    public static String encode(String str){
            
    try {
                
    return URLEncoder.encode(str, UTF_8);
            } 
    catch (UnsupportedEncodingException e) {
                
    return null;
            }
        }
        
        
    /**
         * 將轉(zhuǎn)碼后的文字還原
         * 
    @param str
         * 
    @return
         
    */
        
    public static String decode(String str){
            
    try {
                
    return URLDecoder.decode(str, UTF_8);
            } 
    catch (UnsupportedEncodingException e) {
                
    return null;
            }
        }
    }


    posted @ 2010-12-11 12:06 何楊 閱讀(2100) | 評(píng)論 (0)編輯 收藏

    Web應(yīng)用的安全性一直有一個(gè)先天缺陷,即http基本就是明碼傳遞,這個(gè)缺陷可以讓后臺(tái)做的諸多加密工作一朝崩塌,下面以一個(gè)實(shí)際例子來(lái)說(shuō)明。

    我們還是用TCPMon來(lái)截獲http請(qǐng)求,看從中能否找到有用的信息,下面的Http請(qǐng)求來(lái)自很多網(wǎng)站都有的注冊(cè)和登錄頁(yè)面。TCPMon的具體方法請(qǐng)參照:如何用Apache TCPMon來(lái)截獲SOAP消息。

    下面是用戶注冊(cè)頁(yè)面,我們向其中輸入了一點(diǎn)信息:

    點(diǎn)擊“提交按鈕后”,我們?cè)赥CPMon中可以截獲這樣的內(nèi)容.



    下面是登錄頁(yè)面:


    點(diǎn)擊“登錄”按鈕后,TCPMon截獲的內(nèi)容如下:


    上面兩個(gè)字符串:
    name=%E5%88%98%E5%A4%87&email=1@3445.5&pswd=123456&repswd=123456&brief=rteterte&submitBtn=%E6%8F%90%E4%BA%A4
    name=%E5%88%98%E5%A4%87&pswd=123456&submitBtn=%E7%99%BB%E5%BD%95

    已經(jīng)暴露了不少信息,我們?cè)俎D(zhuǎn)碼一下會(huì)全部暴露出來(lái):
    System.out.println(URLDecoder.decode("name=%E5%88%98%E5%A4%87&email=1@3445.5&pswd=123456&repswd=123456&brief=rteterte&submitBtn=%E6%8F%90%E4%BA%A4","utf-8"));
            System.out.println(URLDecoder.decode("name=%E5%88%98%E5%A4%87
    &pswd=123456&submitBtn=%E7%99%BB%E5%BD%95","utf-8"));

    輸出如下:
    name=劉備&email=1@3445.5&pswd=123456&repswd=123456&brief=rteterte&submitBtn=提交
    name=劉備
    &pswd=123456&submitBtn=登錄

    也就是說(shuō),我們?cè)诒韱沃休斎氲膬?nèi)容,已經(jīng)完全出現(xiàn)在http請(qǐng)求中。只要加一個(gè)網(wǎng)絡(luò)嗅探器(sniffer)來(lái)收集網(wǎng)絡(luò)上傳遞的數(shù)據(jù)報(bào)的相關(guān)信息,再加以少許處理,所有私密信息都將被發(fā)現(xiàn)。
    posted @ 2010-12-11 11:55 何楊 閱讀(1235) | 評(píng)論 (0)編輯 收藏

    注:以下是關(guān)于TCPMon的一些使用常識(shí),如果不需要或是已經(jīng)熟悉就不用往下看了。

    在WebService服務(wù)器和客戶機(jī)之間會(huì)傳遞SOAP消息,有時(shí)我們需要得到這些消息以便調(diào)試,而Apache的TCPMon可以幫助我們做到這一點(diǎn)。

    TCPMon的下載地址在http://ws.apache.org/commons/tcpmon/download.cgi,找到Binary Distribution,
    下載后會(huì)得到一個(gè)tcpmon-1.0-bin.zip的包,解開(kāi)后進(jìn)去\tcpmon-1.0-bin\build目錄,雙擊tcpmon.bat就可以執(zhí)行程序了。

    這里有必要對(duì)tcpmon說(shuō)明一下,它實(shí)際上是個(gè)代理,起一個(gè)消息轉(zhuǎn)發(fā)的作用,監(jiān)視的是轉(zhuǎn)發(fā)出去的消息。最終,消息還是要送到具體的地址和端口,否則響應(yīng)就不正確了。也就是說(shuō),TCPMon是一個(gè)消息的二傳手,它的前后都應(yīng)該配置正確才行。


    現(xiàn)在我們手頭有一個(gè)WebService測(cè)試客戶端,一個(gè)WebService工程運(yùn)行在Tomcat服務(wù)器中,這就是TCPMon的兩端,我們需要把它配置進(jìn)去。

    首先,我們需要修改Tomcat的服務(wù)端口,你可以打開(kāi)Tomcat目錄下的conf目錄下的server.xml文件,將Connector節(jié)點(diǎn)的port屬性值從8080改成8088(也可以是其他端口),如下所示:
    <Connector port="8088" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" />
    這樣,Tomcat服務(wù)器就在8088端口進(jìn)行監(jiān)聽(tīng)了。

    其次,我們需要讓TCPMon在8080端口進(jìn)行監(jiān)聽(tīng),并把收到的消息轉(zhuǎn)發(fā)到8088端口去。我們找到剛才打開(kāi)的TCPMon程序,找到admin選項(xiàng)卡,在listen port #:右邊的文本框中寫(xiě)入8080,在Target HostName右邊的文本框中輸入127.0.0.1,在Tatget port右邊的文本框中輸入8088。如下圖。


    然后,再點(diǎn)擊add按鈕。一個(gè)名為Port 8080的選項(xiàng)卡會(huì)出現(xiàn),這個(gè)界面將負(fù)責(zé)顯示截獲的SOAP消息。

    接下來(lái)就可以啟動(dòng)客戶端程序,客戶端會(huì)向原來(lái)一樣,向127.0.0.1所在的8080端口送出SOAP消息,而這個(gè)消息會(huì)被TCPMon截獲,然后轉(zhuǎn)送到127.0.0.1所在的8088端口去,然后Tomcat會(huì)收到這個(gè)SOAP消息交給負(fù)責(zé)處理的XFire Servlet,處理完的結(jié)果會(huì)通過(guò)TCPMon送回到客戶端。在這個(gè)過(guò)程中,SOAP消息就被完全截獲并顯示在Port 8080選項(xiàng)卡中了。如下圖:


    最后,當(dāng)你的SOAP消息調(diào)試結(jié)束后,別忘了吧Tomcat的端口改回到8080。

    感謝您看到這里。

    posted @ 2010-12-10 19:38 何楊 閱讀(5631) | 評(píng)論 (1)編輯 收藏

    注:下文是關(guān)于WebService的一個(gè)概念和總結(jié),其中的例子來(lái)自http://www.box.net/shared/cyg98xgz78 。 如果您對(duì)WebService已經(jīng)熟悉就不用浪費(fèi)時(shí)間了。

    一.什么是Web服務(wù)?

    Web服務(wù)是網(wǎng)絡(luò)化應(yīng)用程序的一種,我們可以將Web服務(wù)看成一種函數(shù)調(diào)用,只不過(guò)這個(gè)函數(shù)的實(shí)體存在于某個(gè)服務(wù)器上,而調(diào)用在客戶端進(jìn)行。Web服務(wù)的思想很簡(jiǎn)單,即服務(wù)器通過(guò)網(wǎng)絡(luò)提供Web服務(wù),其它程序可以將由Web服務(wù)器封裝的功能無(wú)縫的集成到自己的程序中去。Web服務(wù)是跨平臺(tái)跨語(yǔ)言的,它可以由多種語(yǔ)言創(chuàng)建,也可以由多種語(yǔ)言使用。WebService定義了一套標(biāo)準(zhǔn)的調(diào)用過(guò)程:服務(wù)器端使用WSDL來(lái)向外界描述它所提供的服務(wù),客戶端與服務(wù)器端的交互采用SOAP協(xié)議。

    二.Web服務(wù)有什么益處?
    處于這個(gè)信息化高度發(fā)展的世界,每個(gè)軟件系統(tǒng)都勢(shì)必要和別的軟件系統(tǒng)進(jìn)行交互,它們可能由不同語(yǔ)言編寫(xiě)運(yùn)行在不同的服務(wù)器上,相互間的調(diào)用是一個(gè)很大的難題。Web服務(wù)就是為解決這些問(wèn)題而誕生的,它的語(yǔ)言平臺(tái)無(wú)關(guān)性可以和任一平臺(tái)或語(yǔ)言的軟件進(jìn)行交互,這樣,Web服務(wù)就可以像一座橋梁,可以連通信息化世界中的孤島。

    三.SOAP協(xié)議。
    在Web服務(wù)中,服務(wù)器和客戶機(jī)需要傳遞接收消息,這就需要對(duì)傳輸?shù)臄?shù)據(jù)格式采取一定的約定措施,這個(gè)約定就是SOAP協(xié)議,它的全稱是簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(Simple Object Access Protocl)。SOAP是基于XML的消息包裝器,它既包括客戶端送給服務(wù)器端希望調(diào)用的類和方法的一種消息格式,也包括服務(wù)器返回?cái)?shù)據(jù)的消息格式。有個(gè)這個(gè)協(xié)議,服務(wù)器和客戶機(jī)就能明白對(duì)方想干什么。SOAP消息一般基于HTTP來(lái)傳輸,也可以基于其他協(xié)議。
    下面是一個(gè)客戶端向服務(wù)器發(fā)送的SOAP消息例子:
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap:Body>
        
    <ns1:getServerPublicKey xmlns:ns1="http://heyang.com">
        
    </ns1:getServerPublicKey>
    </soap:Body>
    </soap:Envelope>
    客戶機(jī)向服務(wù)器端發(fā)送消息時(shí),</soap:Body>中的XML包含要調(diào)用的方法和參數(shù),如上述的getServerPublicKey。

    下面是服務(wù)器反饋給客戶機(jī)的SOAP消息例子:
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        
    <soap:Body>
        
    <ns1:getServerPublicKeyResponse xmlns:ns1="hello.XFire">    <ns1:out>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDkSpbrSfBIIu+f4mMr7Ie2JdWCBEmlZ1mcoZ0UTNMGaVwexfRax+HC/uusXvkkdoUGYjMaiMycRsQtSOLsfKjOVY/8zBLs0tAOEVelg6MyiF3DV7PVgGEq0dpXJCz0MWFY34a1YJMbPfvPa+VpZaIFbzICUPRhVdBYPAboXthFyQIDAQAB
        
    </ns1:out>
        
    </ns1:getServerPublicKeyResponse>
        
    </soap:Body>
    </soap:Envelope>
    當(dāng)服務(wù)器端送回消息時(shí),</soap:Body>中包含調(diào)用的結(jié)果,它可以是單個(gè)值,也可以是含有多個(gè)值的復(fù)雜數(shù)據(jù)類型。如上面的<ns1:out>中的節(jié)點(diǎn)值。

    另:在調(diào)試WebService程序,想要查看SOAP消息時(shí),可以使用Apache的TCPMon工具,具體使用方法請(qǐng)看http://m.tkk7.com/heyang/archive/2010/12/10/340294.html.

    四.服務(wù)器端收到SOAP消息后的動(dòng)作

    以XFire為例,當(dāng)一個(gè)來(lái)自客戶端的SOPA請(qǐng)求送達(dá)WebService服務(wù)端時(shí),它會(huì)先送到一個(gè)Servlet(XFireConfigurableServlet)中(請(qǐng)參看web.xml中的配置),然后開(kāi)始解析SOAP消息,再根據(jù)配置文件services.xml找到接口com.heyang.IService和具體的實(shí)現(xiàn)類com.heyang.ServiceImpl中的方法,調(diào)用函數(shù)產(chǎn)生結(jié)果,然后再包裝成SOAP消息返回。Axis的做法也是類似的。

    五.WSDL
    我們現(xiàn)在可以想到Web服務(wù)是一個(gè)對(duì)象,含有一個(gè)或多個(gè)方法。如何對(duì)一個(gè)WebService服務(wù)器能提供的方法進(jìn)行說(shuō)明呢?這里就要用到WSDL(Web Service Description Language),它定義了Web服務(wù)提供的可供操作的函數(shù),具體如下:
    <?xml version="1.0" encoding="UTF-8" ?>
    <wsdl:definitions targetNamespace="hello.XFire" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:tns="hello.XFire" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    <wsdl:types>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="hello.XFire">
    <xsd:element name="getServerPublicKey">
      
    <xsd:complexType />
      
    </xsd:element>
    <xsd:element name="getServerPublicKeyResponse">
    <xsd:complexType>
    <xsd:sequence>
      
    <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:base64Binary" />
      
    </xsd:sequence>
      
    </xsd:complexType>
      
    </xsd:element>
    <xsd:element name="getResonse">
    <xsd:complexType>
    <xsd:sequence>
      
    <xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:base64Binary" />
      
    <xsd:element maxOccurs="1" minOccurs="1" name="in1" nillable="true" type="xsd:base64Binary" />
      
    </xsd:sequence>
      
    </xsd:complexType>
      
    </xsd:element>
    <xsd:element name="getResonseResponse">
    <xsd:complexType>
    <xsd:sequence>
      
    <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:base64Binary" />
      
    </xsd:sequence>
      
    </xsd:complexType>
      
    </xsd:element>
      
    </xsd:schema>
      
    </wsdl:types>
    <wsdl:message name="getServerPublicKeyRequest">
      
    <wsdl:part name="parameters" element="tns:getServerPublicKey" />
      
    </wsdl:message>
    <wsdl:message name="getResonseResponse">
      
    <wsdl:part name="parameters" element="tns:getResonseResponse" />
      
    </wsdl:message>
    <wsdl:message name="getServerPublicKeyResponse">
      
    <wsdl:part name="parameters" element="tns:getServerPublicKeyResponse" />
      
    </wsdl:message>
    <wsdl:message name="getResonseRequest">
      
    <wsdl:part name="parameters" element="tns:getResonse" />
      
    </wsdl:message>
    <wsdl:portType name="helloPortType">
    <wsdl:operation name="getServerPublicKey">
      
    <wsdl:input name="getServerPublicKeyRequest" message="tns:getServerPublicKeyRequest" />
      
    <wsdl:output name="getServerPublicKeyResponse" message="tns:getServerPublicKeyResponse" />
      
    </wsdl:operation>
    <wsdl:operation name="getResonse">
      
    <wsdl:input name="getResonseRequest" message="tns:getResonseRequest" />
      
    <wsdl:output name="getResonseResponse" message="tns:getResonseResponse" />
      
    </wsdl:operation>
      
    </wsdl:portType>
    <wsdl:binding name="helloHttpBinding" type="tns:helloPortType">
      
    <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="getServerPublicKey">
      
    <wsdlsoap:operation soapAction="" />
    <wsdl:input name="getServerPublicKeyRequest">
      
    <wsdlsoap:body use="literal" />
      
    </wsdl:input>
    <wsdl:output name="getServerPublicKeyResponse">
      
    <wsdlsoap:body use="literal" />
      
    </wsdl:output>
      
    </wsdl:operation>
    <wsdl:operation name="getResonse">
      
    <wsdlsoap:operation soapAction="" />
    <wsdl:input name="getResonseRequest">
      
    <wsdlsoap:body use="literal" />
      
    </wsdl:input>
    <wsdl:output name="getResonseResponse">
      
    <wsdlsoap:body use="literal" />
      
    </wsdl:output>
      
    </wsdl:operation>
      
    </wsdl:binding>
    <wsdl:service name="hello">
    <wsdl:port name="helloHttpPort" binding="tns:helloHttpBinding">
      
    <wsdlsoap:address location="http://localhost:8080/XfireSample/services/hello" />
      
    </wsdl:port>
      
    </wsdl:service>
      
    </wsdl:definitions>
      以上內(nèi)容在瀏覽器中輸入http://localhost:8080/XfireSample/services/hello?wsdl 可以看到。

      WSDL本身比較復(fù)雜,它主要給程序看的,利用當(dāng)前大多數(shù)的Web服務(wù)工具可以生成它,而無(wú)需手工編寫(xiě)它。
      WSDL的主要目的在于將自己的Web服務(wù)的所有相關(guān)內(nèi)容如提供服務(wù)的傳輸方式,服務(wù)方法接口,接口參數(shù),服務(wù)路徑等,生成相應(yīng)的完全的文檔,發(fā)布給使用者。使用者可以通過(guò)這個(gè)WSDL文檔,創(chuàng)建相應(yīng)的SOAP請(qǐng)求消息,通過(guò)HTTP傳遞給Web服務(wù)提供者;Web服務(wù)提供者在完成請(qǐng)求服務(wù)后,將SOAP返回消息傳回給請(qǐng)求者,服務(wù)請(qǐng)求者再根據(jù)WSDL文檔將SOAP返回消息解析成程序能夠理解的內(nèi)容。

    六.UDDI
    UDDI是Universal Description Discovery and Intergretion的縮寫(xiě),是一種創(chuàng)建注冊(cè)服務(wù)的規(guī)范,以便大家將自己的Web Service進(jìn)行注冊(cè)發(fā)布供使用者查找。
    當(dāng)服務(wù)提供者想將自己的Web Service發(fā)布,以便外部能找到其服務(wù)時(shí),那么服務(wù)提供這可以將自己的Web Service注冊(cè)到相應(yīng)的UDDI商用注冊(cè)網(wǎng)站。
    UDDI并非一個(gè)必須的Web Service組件,服務(wù)方完全可以不進(jìn)行UDDI的注冊(cè)。因?yàn)閃SDL文件中已經(jīng)給出了Web Service的地址URI,外部可以通過(guò)它進(jìn)行相應(yīng)的Web Service調(diào)用.

    七.消息服務(wù)與WebService的比較

    在概念上,Web Service和消息服務(wù)它們都是傳輸數(shù)據(jù)到別的組件,都是使應(yīng)用程序之間可以進(jìn)行異步通信。
    消息處理和Web Service是互補(bǔ)的技術(shù),消息服務(wù)明確是一項(xiàng)為企業(yè)內(nèi)部而不是為商業(yè)領(lǐng)域內(nèi)的應(yīng)用程序提供通信的技術(shù),使用消息處理,企業(yè)必須與共用的傳輸格式達(dá)成一致,在定義應(yīng)用程序之間傳遞的數(shù)據(jù)方面,消息具有更多的靈活性,另外,Web Service缺乏一個(gè)定義好的機(jī)制,用于確保SOAP傳輸和事務(wù)處理,這些是消息服務(wù)已經(jīng)定義好和成熟的部分。
    Web Service,是松散耦合的組件,應(yīng)用程序發(fā)送請(qǐng)求給它進(jìn)行處理和數(shù)據(jù)服務(wù),結(jié)果返回給應(yīng)用程序繼續(xù)處理,傳輸機(jī)制是Simple Object Access Protocol(簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議,SOAP),Web Service通過(guò)SOAP能有效的通過(guò)HTTP協(xié)議發(fā)送XML文檔。Web Service具有公開(kāi)性,具有快速推進(jìn)的標(biāo)準(zhǔn)和大量出版物與技術(shù)文檔。Web Service有潛力來(lái)連接不同的應(yīng)用程序組件,把軟件定義成服務(wù)而不是產(chǎn)品。如果應(yīng)用程序是新建的,則Web Service更為合理。

    八.使用Axis的WebService實(shí)現(xiàn)。
    以上文章是針對(duì)XFire的WS實(shí)現(xiàn),如果要用Axis的實(shí)現(xiàn),可以參考這里 http://m.tkk7.com/heyang/archive/2009/10/10/297729.htmlhttp://m.tkk7.com/heyang/archive/2009/09/29/296897.html。個(gè)人感覺(jué)XFire的方案更方便快捷,如果沒(méi)有限制的話建議使用XFire實(shí)現(xiàn)Web Service。

    好了,感謝您看到這里。
    posted @ 2010-12-10 17:27 何楊 閱讀(444) | 評(píng)論 (0)編輯 收藏

    一.框架類
       1.JavaScript框架:ExtJshttp://www.sencha.com/
       2.O/R Mapping框架:Hibernatehttp://www.hibernate.org/
       3.JavaScript框架:Jquery(http://jquery.com/)
       4.JavaScript框架:Prototypehttp://www.prototypejs.org/
       5.業(yè)務(wù)層Bean管理框架:Springhttp://www.springsource.org/
       6.Web框架Struts1:Strutshttp://struts.apache.org/
       7.Web框架Struts2:Struts 2http://struts.apache.org/2.x/index.html

    二.工具包類
       1.用于編碼處理(Base64,DES,RSA.MD5等)的Apache Commons Codechttp://commons.apache.org/codec/

    三.開(kāi)發(fā)測(cè)試工具
       1.網(wǎng)頁(yè)測(cè)試工具:HttpUnithttp://httpunit.sourceforge.net/
       2.Java單元測(cè)試工具:JUnithttp://www.junit.org/
       3.網(wǎng)絡(luò)數(shù)據(jù)包截獲工具:TCPMonhttp://ws.apache.org/commons/tcpmon/download.cgi

    四.服務(wù)器類


    五.數(shù)據(jù)庫(kù)類
       1.輕量級(jí)純JavaSQL數(shù)據(jù)庫(kù)引擎HSQLDBhttp://hsqldb.org/
       2.重量級(jí)數(shù)據(jù)庫(kù)Oraclehttp://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

    六.插件類
       1.用于UML圖繪制的Eclipse插件Amateurhttp://sourceforge.jp/projects/amateras/releases/?package_id=4435

    七.技術(shù)站點(diǎn)社區(qū)類
       1.中文綜合技術(shù)社區(qū)CSDN社區(qū)http://community.csdn.net/
       2.英文綜合技術(shù)站點(diǎn)ServerSidehttp://www.theserverside.com/

    八.引擎類
       1.Java Web服務(wù)實(shí)現(xiàn)引擎:XFirehttp://xfire.codehaus.org/
       2.Java Web服務(wù)實(shí)現(xiàn)引擎:Axis2(http://axis.apache.org/axis2/java/core/download.cgi

    九.工具類
       1.網(wǎng)絡(luò)數(shù)據(jù)包嗅探器Wiresharkhttp://www.wireshark.org/download.html
       2.Web檢測(cè)工具WebToolhttp://www.hackline.net/a/soft/tools/2010/0603/4198.html
       3.Office工具POI(http://poi.apache.org/
    posted @ 2010-12-09 20:32 何楊 閱讀(387) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共28頁(yè): First 上一頁(yè) 13 14 15 16 17 18 19 20 21 下一頁(yè) Last 
    主站蜘蛛池模板: 亚洲高清视频免费| 亚洲精品无码国产| 亚洲av麻豆aⅴ无码电影| 久久久久一级精品亚洲国产成人综合AV区| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久亚洲精品成人av无码网站| 亚洲黄色在线视频| 中文字幕亚洲综合小综合在线| 亚洲av无码日韩av无码网站冲| 亚洲黄片手机免费观看| 四虎成人精品永久免费AV| 无码中文字幕av免费放| 免费人成视网站在线观看不卡| 亚洲不卡中文字幕无码| 亚洲国产精品成人综合色在线婷婷 | 亚洲五月午夜免费在线视频 | 亚洲成?Ⅴ人在线观看无码| 亚洲Av永久无码精品三区在线| 亚洲成aⅴ人在线观看| 免费亚洲视频在线观看| 久久精品成人免费网站| 九九精品免费视频| 国产精品亚洲综合一区| 91亚洲精品自在在线观看| 美女露隐私全部免费直播| 香港a毛片免费观看| 四虎成人免费网站在线| 亚洲精品tv久久久久久久久| 亚洲永久在线观看| 精品国产污污免费网站入口在线 | 亚洲视频在线免费观看| 永久黄网站色视频免费观看| 黑人精品videos亚洲人| 亚洲精品无码不卡在线播放| 免费一区二区无码东京热| 在线免费观看中文字幕| 久久久亚洲精品国产| 国产成人亚洲综合a∨| 狼群影院在线观看免费观看直播| 亚洲AⅤ永久无码精品AA | 亚洲国产高清在线精品一区|