1. 程式人生 > >CXF密碼驗證_服務端和客戶端配置

CXF密碼驗證_服務端和客戶端配置

1:服務端spring裡的配置:

Java程式碼  收藏程式碼
  1. <bean id="Customer"class="org.web.HelloServiceImpl"></bean>  
  2. lt;jaxws:endpoint  id="custom"  implementor="#Customer"   address="/web" >  
  3.      <jaxws:inInterceptors>    
  4.           <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />    
  5.           <!--<bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />    
  6.           -->  
  7.           <bean class="org.web.soapHeader.ReadSoapHeader"></bean>  
  8.           <!--<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">    
  9.               <constructor-arg>    
  10.                   <map>    
  11.                       <entry key="action" value="UsernameToken" />    
  12.                       <entry key="passwordType"
  13.                           value="PasswordText" />    
  14.                       <entry key="user" value="cxfServer" />    
  15.                       <entry key="passwordCallbackRef"
    >    
  16.                           <ref bean="serverPasswordCallback" />    
  17.                       </entry>    
  18.                   </map>    
  19.               </constructor-arg>    
  20.           </bean> -->  
  21.           </jaxws:inInterceptors>    
  22. </jaxws:endpoint>  

這個裡面是有註釋的..區別上一個密碼驗證的示例!

關鍵程式碼就有一句: <bean class="org.web.soapHeader.ReadSoapHeader"></bean>

 這個是自己寫的讀取soap資訊.檢視密碼是否正確!

2:soap讀入資訊的驗證:ReadSoapHeader程式碼:

Java程式碼  收藏程式碼
  1. publicclass ReadSoapHeader extends AbstractPhaseInterceptor<SoapMessage> {  
  2.     private SAAJInInterceptor saa=new SAAJInInterceptor();  
  3.     public ReadSoapHeader(){  
  4.         super(Phase.PRE_PROTOCOL);  
  5.         getAfter().add(SAAJInInterceptor.class.getName());  
  6.     }  
  7.     publicvoid handleMessage(SoapMessage message) throws Fault {  
  8.         SOAPMessage mess=message.getContent(SOAPMessage.class);  
  9.         if(mess==null){  
  10.             saa.handleMessage(message);  
  11.             mess=message.getContent(SOAPMessage.class);  
  12.         }  
  13.         SOAPHeader head=null;  
  14.         try {  
  15.             head = mess.getSOAPHeader();  
  16.         } catch (SOAPException e) {  
  17.             e.printStackTrace();  
  18.         }  
  19.         if(head==null){  
  20.             return;  
  21.         }  
  22.         NodeList nodes=head.getElementsByTagName("tns:spId");  
  23.         NodeList nodepass=head.getElementsByTagName("tns:spPassword");  
  24.         if(nodes.item(0).getTextContent().indexOf("wdw")!=-1){  
  25.             if(nodepass.item(0).getTextContent().equals("wdwsb")){  
  26.                 System.out.println("認證成功");  
  27.             }  
  28.         }  
  29.         else{  
  30.             SOAPException soapExc=new SOAPException("認證錯誤");  
  31.             thrownew Fault(soapExc);  
  32.         }  
  33.     }  
  34. }  

 功能:判斷客戶端傳來的soap資訊頭是否有密碼..有的話判斷是否正確!

3:客戶端spring的配置:

Java程式碼  收藏程式碼
  1. <bean id="webTest"class="org.web.HelloService" factory-bean="client" factory-method="create"/>  
  2.  <bean id="client"class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean" >  
  3.         <property name="address" value="http://127.0.0.1:88/Hello/web/web"></property>  
  4.         <property name="serviceClass" value="org.web.HelloService"></property>  
  5.         <property name="outInterceptors">  
  6.             <list>  
  7.                 <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />    
  8.                 <!--<bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />  -->  
  9.                 <bean class="org.web.soapHeader.AddSoapHeader"></bean>  
  10.                 <!--<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">    
  11.                     <constructor-arg>    
  12.                         <map>    
  13.                             <entry key="action" value="UsernameToken" />    
  14.                             <entry key="passwordType"  value="PasswordText" />    
  15.                             <entry key="user" value="cxfClient" />    
  16.                             <entry key="passwordCallbackRef">    
  17.                                 <ref bean="clientPasswordCallback" />    
  18.                             </entry>    
  19.                         </map>    
  20.                     </constructor-arg>    
  21.                 </bean>    
  22.             -->  
  23.             </list>  
  24.     </property>  
  25.  </bean>  

 PS:注意註釋>...重點是:

Java程式碼  收藏程式碼
  1. <bean class="org.web.soapHeader.AddSoapHeader"></bean>  

 4:對soap進行如入頭資訊.把密碼加進去:AddSoapHeader程式碼:

Java程式碼  收藏程式碼
  1. publicclass AddSoapHeader extends AbstractSoapInterceptor {  
  2.     privatestatic String nameURI="http://127.0.0.1/Hello/web";  
  3.     public AddSoapHeader(){  
  4.         super(Phase.WRITE);  
  5.     }  
  6.     publicvoid handleMessage(SoapMessage message) throws Fault {  
  7.         SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  8.         Date date=new Date();  
  9.         String time =sd.format(date);  
  10.         String spPassword="wdwsb";  
  11.         String spName="wdw";  
  12.         QName qname=new QName("RequestSOAPHeader");  
  13.         Document doc=DOMUtils.createDocument();  
  14.         Element spId=doc.createElement("tns:spId");  
  15.         spId.setTextContent(spName);  
  16.         Element spPass=doc.createElement("tns:spPassword");  
  17.         spPass.setTextContent(spPassword);  
  18.         Element root=doc.createElementNS(nameURI, "tns:RequestSOAPHeader");  
  19.         root.appendChild(spId);  
  20.         root.appendChild(spPass);  
  21.         SoapHeader head=new SoapHeader(qname,root);  
  22.         List<Header> headers=message.getHeaders();  
  23.         headers.add(head);  
  24.     }  
  25. }  

 很簡單的東西...現在密碼已經加進去了...spring裡也已經配置好了..

客戶端就可以正常的請求了..對請求的內容會進行soap頭處理.把密碼加進去....

服務端通過了客戶端的許可權密碼請求就可以了.