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

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

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

    Java世界

    學(xué)習(xí)筆記

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    天籟村

    新華網(wǎng)

    雅虎

    最新評(píng)論

    基于Xfire SOAP Header的WebService安全驗(yàn)證教程 .

    WebSerice是一種開(kāi)放的web服務(wù),任何人都可以訪問(wèn),但我們有時(shí)候需要考慮只有付費(fèi)用戶才能使用WS,所以,我們就需要對(duì)WS加入安全驗(yàn)證機(jī)制,當(dāng)然,可以利用防火墻的IP過(guò)濾,web應(yīng)用的配置從最外層去隔離非法用戶,但在內(nèi)層,我們也可以使用SOAP Header的方式,由客戶端發(fā)送驗(yàn)證數(shù)據(jù),服務(wù)端驗(yàn)通過(guò)后基WS訪問(wèn)權(quán)限

    首先根據(jù)我的這篇Blog

    http://blog.csdn.net/daryl715/archive/2007/07/25/1707161.aspx

    配置WS Server和WS Client,其中Client端的測(cè)試代碼類(lèi)名由Client改為ClientTest,因?yàn)槲覀円玫絏fire的一個(gè)名為Client的類(lèi) 

     

    首先我們編寫(xiě)服務(wù)端驗(yàn)證類(lèi)繼承AbstractHandler

     

    package test;

    import org.codehaus.xfire.MessageContext;
    import org.codehaus.xfire.handler.AbstractHandler;
    import org.jdom.Element;

    public class AuthenticationHandler extends AbstractHandler {

        
    public void invoke(MessageContext cfx) throws Exception {
               
    if(cfx.getInMessage().getHeader() == null)
               
    {
                   
    throw new org.codehaus.xfire.fault.XFireFault("請(qǐng)求必須包含驗(yàn)證信息",org.codehaus.xfire.fault.XFireFault.SENDER);
               }

               Element token
    =cfx.getInMessage().getHeader().getChild("AuthenticationToken");
               
    if (token == null
               

                
    throw new org.codehaus.xfire.fault.XFireFault("請(qǐng)求必須包含身份驗(yàn)證信息", org.codehaus.xfire.fault.XFireFault.SENDER); 
               }
     

                  String username 
    = token.getChild("Username").getValue(); 
                  String password 
    = token.getChild("Password").getValue(); 
                  
    try 
                  

                      
    //進(jìn)行身份驗(yàn)證 ,只有abcd@1234的用戶為授權(quán)用戶
                     if(username.equals("abcd"&& password.equals("1234"))
                      
    //這語(yǔ)句不顯示
                      System.out.println("身份驗(yàn)證通過(guò)");
                     
    else throw new Exception();
                  }
     
                  
    catch (Exception e) 
                  

                      
    throw new   org.codehaus.xfire.fault.XFireFault("非法的用戶名和密碼",   org.codehaus.xfire.fault.XFireFault.SENDER); 
                  }
     

              }
     



    }

     

    下面是Client發(fā)送授權(quán)信息

     

    package test;

    import org.codehaus.xfire.MessageContext;
    import org.codehaus.xfire.handler.AbstractHandler;
    import org.jdom.Element;

    public class ClientAuthenticationHandler extends AbstractHandler {

         
    private String username = null

         
    private String password = null

         
    public ClientAuthenticationHandler() 

         }
     

         
    public ClientAuthenticationHandler(String username,String password) 

             
    this.username = username; 

             
    this.password = password; 
         }
     

         
    public void setUsername(String username) 

             
    this.username = username; 

         }
     

         
    public void setPassword(String password) 

             
    this.password = password; 

         }
     

         
    public void invoke(MessageContext context) throws Exception 

             
    //為SOAP Header構(gòu)造驗(yàn)證信息
             Element el = new Element("header"); 
             context.getOutMessage().setHeader(el); 
             Element auth 
    = new Element("AuthenticationToken"); 
             Element username_el 
    = new Element("Username"); 
             username_el.addContent(username); 
             Element password_el 
    = new Element("Password"); 
             password_el.addContent(password); 
             auth.addContent(username_el); 
             auth.addContent(password_el); 
             el.addContent(auth); 
         }
     



    }

    為ClientTest.java加入以下代碼

     XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);
    Client client = proxy.getClient();
    client.addOutHandler(new ClientAuthenticationHandler("abcd1","1234"));

    等等,還沒(méi)有完,修改Services.xm為WS綁定Handler

      

    <?xml version="1.0" encoding="UTF-8"?>


    <beans>
    <service xmlns="http://xfire.codehaus.org/config/1.0">
    <name>HelloService</name>
    <namespace>http://test/HelloService</namespace>
    <serviceClass>test.IHelloService</serviceClass>
    <implementationClass>test.HelloServiceImpl</implementationClass>
     
    <inHandlers> 
     
    <handler  handlerClass ="test.AuthenticationHandler" ></handler > 
     
    </inHandlers>
    </service>
    </beans>


    這樣我們就完成了編碼,下面啟動(dòng)tomcat,運(yùn)行客戶端代碼,本文為abcd@1234位授權(quán)用戶,使用abcd@1234,可以正常訪問(wèn)WS,如果用錯(cuò)誤帳號(hào),則會(huì)有以下異常

     

    Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: 非法的用戶名和密碼
    org.codehaus.xfire.fault.XFireFault: 非法的用戶名和密碼
        at org.codehaus.xfire.fault.Soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31)
        at org.codehaus.xfire.fault.SoapFaultSerializer.readMessage(SoapFaultSerializer.java:28)
        at org.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111)
        at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67)
        at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
        at org.codehaus.xfire.client.Client.onReceive(Client.java:406)
        at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)
        at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
        at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
        at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
        at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
        at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
        at org.codehaus.xfire.client.Client.invoke(Client.java:336)
        at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
        at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
        at $Proxy0.getUser(Unknown Source)
        at test.ClientTest.main(ClientTest.java:39)

     

    如果不在CientTest加以下增加Heade則會(huì)有以下異常

     XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);
    Client client = proxy.getClient();
     client.addOutHandler(new ClientAuthenticationHandler("abcd1","1234"));

    Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: 請(qǐng)求必須包含驗(yàn)證信息
    org.codehaus.xfire.fault.XFireFault: 請(qǐng)求必須包含驗(yàn)證信息
        at org.codehaus.xfire.fault.Soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31)
        at org.codehaus.xfire.fault.SoapFaultSerializer.readMessage(SoapFaultSerializer.java:28)
        at org.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111)
        at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67)
        at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
        at org.codehaus.xfire.client.Client.onReceive(Client.java:406)
        at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)
        at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
        at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
        at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
        at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
        at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
        at org.codehaus.xfire.client.Client.invoke(Client.java:336)
        at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
        at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
        at $Proxy0.getUser(Unknown Source)
        at test.ClientTest.main(ClientTest.java:35)

    posted on 2013-10-24 16:28 Rabbit 閱讀(3426) 評(píng)論(1)  編輯  收藏

    評(píng)論

    # re: 基于Xfire SOAP Header的WebService安全驗(yàn)證教程 . 2014-03-19 17:33 whuang

    寫(xiě)得很清楚,謝謝  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 在线jyzzjyzz免费视频| 亚洲午夜精品一区二区麻豆| 成人免费午夜无码视频| 国产黄色片免费看| 亚洲人成色99999在线观看| 久久久久亚洲精品美女| 一级毛片直播亚洲| 最近中文字幕免费mv视频8| 一区二区免费视频| ssswww日本免费网站片| 精品国产免费一区二区三区| 亚洲精品女同中文字幕| 亚洲熟妇色自偷自拍另类| 亚洲第一区香蕉_国产a| 亚洲嫩模在线观看| 国产亚洲AV无码AV男人的天堂| 国产乱人免费视频| 女人张开腿给人桶免费视频| 在线观看免费宅男视频| 国产小视频免费观看| 在线免费视频一区| 亚洲AV无码专区日韩| 国产成人免费A在线视频| 亚洲国产婷婷香蕉久久久久久| 国产色爽免费视频| 久久亚洲中文字幕精品一区| 午夜亚洲av永久无码精品| 亚洲av片一区二区三区| 精品久久久久久亚洲| 国产伦精品一区二区三区免费下载| 免费少妇a级毛片人成网| 四虎永久免费影院| 亚洲精品无码高潮喷水在线| 亚洲男女性高爱潮网站| 亚洲精品欧美综合四区| 成在线人视频免费视频| 国产真人无码作爱免费视频 | 免费**毛片在线播放直播| gogo全球高清大胆亚洲| 国产aⅴ无码专区亚洲av| 国产亚洲国产bv网站在线|