天天看點

CXF 入門:建立一個基于SOAPHeader的安全驗證(CXF攔截器使用)

CXF 入門:HelloWorld接口釋出

CXF 入門: 遠端接口調用

下面具體的webservice實作類直接用的是上面的,這裡不再說明

Java代碼  

CXF 入門:建立一個基于SOAPHeader的安全驗證(CXF攔截器使用)
  1. CXF攔截器使用,建立一個使用SOAPHeader的安全驗證  
  2. xml格式:  
  3. <soap:Header>  
  4.     <auth:authentication xmlns:auth="http://gd.chinamobile.com//authentication">  
  5.         <auth:systemID>1</auth:systemID>  
  6.         <auth:userID>test</auth:userID>  
  7.         <auth:password>test</auth:password>  
  8.     </auth:authentication>  
  9. </soap:Header>  
  10. 一,首先在服務端建立一個攔截器(被調用端),需要繼承org.apache.cxf.phase.AbstractPhaseInterceptor  
  11. 代碼如下:  
  12. import java.util.List;  
  13. import javax.xml.soap.SOAPException;  
  14. import org.apache.cxf.binding.soap.SoapHeader;  
  15. import org.apache.cxf.binding.soap.SoapMessage;  
  16. import org.apache.cxf.headers.Header;  
  17. import org.apache.cxf.helpers.XMLUtils;  
  18. import org.apache.cxf.interceptor.Fault;  
  19. import org.apache.cxf.phase.AbstractPhaseInterceptor;  
  20. import org.apache.cxf.phase.Phase;  
  21. import org.apache.log4j.Logger;  
  22. import org.w3c.dom.Element;  
  23. import org.w3c.dom.NodeList;  
  24. public class AuthIntercetpr extends AbstractPhaseInterceptor<SoapMessage> {  
  25.     private static final Logger logger = Logger.getLogger(AuthIntercetpr.class);  
  26.     public static final String xml_namespaceUR_att = "http://gd.chinamobile.com//authentication";  
  27.     public static final String xml_header_el = "soap:Header";  
  28.     public static final String xml_authentication_el = "auth:authentication";  
  29.     public static final String xml_systemID_el = "auth:systemID";  
  30.     public static final String xml_userID_el = "auth:userID";  
  31.     public static final String xml_password_el = "auth:password";  
  32.     public AuthIntercetpr() {  
  33.         // 指定該攔截器在哪個階段被激發  
  34.         super(Phase.PRE_INVOKE);  
  35.     }  
  36.     // 處理消息  
  37.     public void handleMessage(SoapMessage message) {  
  38.         logger.info("==================SoapMessage =" + message);  
  39.         // 擷取SOAP消息的全部頭  
  40.         List<Header> headers = message.getHeaders();  
  41.         if (null == headers || headers.size() < 1) {  
  42.             throw new Fault(new SOAPException("SOAP消息頭格式不對哦!"));  
  43.         }  
  44.         for (Header header : headers) {  
  45.             SoapHeader soapHeader = (SoapHeader) header;  
  46.             // 取出SOAP的Header元素  
  47.             Element element = (Element) soapHeader.getObject();  
  48.             logger.info("ELEMENT =" + element.toString());  
  49.             XMLUtils.printDOM(element);  
  50.             NodeList userIdNodes = element  
  51.                     .getElementsByTagName(xml_userID_el);  
  52.             NodeList pwdNodes = element  
  53.                     .getElementsByTagName(xml_password_el);  
  54.             NodeList systemIdNodes = element  
  55.                     .getElementsByTagName(xml_systemID_el);  
  56.             logger.info("############ 列印帳号資訊 ##############");  
  57.             logger.info(userIdNodes.item(0) + "="  
  58.                     + userIdNodes.item(0).getTextContent());  
  59.             logger.info(systemIdNodes.item(0) + "="  
  60.                     + systemIdNodes.item(0).getTextContent());  
  61.             logger.info(pwdNodes.item(0) + "="  
  62.                     + pwdNodes.item(0).getTextContent());  
  63.             logger.info("############————————##############");  
  64.             if (null != userIdNodes  
  65.                     && userIdNodes.item(0).getTextContent().equels("test") ) {  
  66.                 if (null != pwdNodes  
  67.                         && pwdNodes.item(0).getTextContent().equals("test")) {  
  68.                     logger.info("$$$$$$$$ 認證成功");  
  69.                 } else {//認證失敗則抛出異常,停止繼續操作  
  70.                     SOAPException soapExc = new SOAPException("閣下可能不是合法使用者!");  
  71.                     throw new Fault(soapExc);  
  72.                 }  
  73.             } else {//認證失敗則抛出異常,停止繼續操作  
  74.                 SOAPException soapExc = new SOAPException("閣下可能不是合法使用者!");  
  75.                 throw new Fault(soapExc);  
  76.             }  
  77.         }  
  78.     }  
  79. }  
  80. 二,修改cxf-beans.xml  
  81. <!--id:随意配,implementor:指定接口具體實作類,address:随意配,通路時會用到,下面會做說明-->  
  82. <!--攔截器-->  
  83. <bean id="authIntercetpr" class="unitTest.AuthIntercetpr"></bean>  
  84. <jaxws:endpoint id="HelloWorldService" implementor="com.ws.HelloWorldServiceImpl"  
  85.         address="/IHelloService">  
  86.         <!-- 在此配置調用目前ws所觸發的攔截器-->  
  87.         <jaxws:inInterceptors><ref bean="authIntercetpr" /></bean>   
  88.         <!--或者直接在這裡寫<bean  class="unitTest.AuthIntercetpr"></bean>-->  
  89.         </jaxws:inInterceptors>  
  90. </jaxws:endpoint>  
  91. 到此服務端工作完畢!!!  
  92. 下面是用戶端(調用端)  
  93. 三,這邊同樣建立一個攔截器,實作org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor  
  94. import java.text.SimpleDateFormat;  
  95. import java.util.Date;  
  96. import java.util.List;  
  97. import javax.xml.namespace.QName;  
  98. import org.apache.cxf.binding.soap.SoapHeader;  
  99. import org.apache.cxf.binding.soap.SoapMessage;  
  100. import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;  
  101. import org.apache.cxf.headers.Header;  
  102. import org.apache.cxf.helpers.DOMUtils;  
  103. import org.apache.cxf.helpers.XMLUtils;  
  104. import org.apache.cxf.interceptor.Fault;  
  105. import org.apache.cxf.phase.Phase;  
  106. import org.w3c.dom.Document;  
  107. import org.w3c.dom.Element;  
  108. public class AddSoapHeader extends AbstractSoapInterceptor {  
  109.     public static final String xml_namespaceUR_att = "http://gd.chinamobile.com//authentication";  
  110.     public static final String xml_header_el = "soap:Header";  
  111.     public static final String xml_authentication_el = "auth:authentication";  
  112.     public static final String xml_systemID_el = "auth:systemID";  
  113.     public static final String xml_userID_el = "auth:userID";  
  114.     public static final String xml_password_el = "auth:password";  
  115.     public AddSoapHeader() {  
  116.     // 指定該攔截器在哪個階段被激發  
  117.         super(Phase.WRITE);  
  118.     }  
  119.     public void handleMessage(SoapMessage message) throws Fault {  
  120.         SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  121.         Date date = new Date();  
  122.         String time = sd.format(date);  
  123.         String userId = "test";  
  124.         String sysId = "1";  
  125.         String password = "test";  
  126.         QName qname = new QName("RequestSOAPHeader");//這個值暫時不清楚具體做什麼用,可以随便寫  
  127.         Document doc = (Document) DOMUtils.createDocument();  
  128.         Element root = doc.createElement(xml_header_el);  
  129.         Element eSysId = doc.createElement(xml_systemID_el);  
  130.         eSysId.setTextContent(sysId);  
  131.         Element eUserId = doc.createElement(xml_userID_el);  
  132.         eUserId.setTextContent(userId);  
  133.         Element ePwd = doc.createElement(xml_password_el);  
  134.         ePwd.setTextContent(password);  
  135.         Element child = doc.createElementNS(xml_namespaceUR_att,  
  136.                 xml_authentication_el);  
  137.         child.appendChild(eSysId);  
  138.         child.appendChild(eUserId);  
  139.         child.appendChild(ePwd);  
  140.         root.appendChild(child);  
  141.         XMLUtils.printDOM(root);// 隻是列印xml内容到控制台,可删除  
  142.         SoapHeader head = new SoapHeader(qname, root);  
  143.         List<Header> headers = message.getHeaders();  
  144.         headers.add(head);  
  145.     }  
  146. }  
  147. 四,具體調用ws的類代碼  
  148.     private static final String webServiceConTimeout = "6000";  
  149.     private static final String webServiceRevTimeout = "6000";  
  150.     。。。。。。。  
  151.         HelloWorldServiceImplService hello = new HelloWorldServiceImplService();    
  152.         HelloWorldService service = hello.getHelloWorldServiceImplPort();  
  153.         //以上什麼意思請參考:http://learning.iteye.com/admin/blogs/1333223  
  154.         Client clientProxy = ClientProxy.getClient(service);//通過目标ws擷取代理  
  155.         //注入攔截器,getOutInterceptors代表調用服務端時觸發,getInInterceptors就是被調用才觸發  
  156.         clientProxy.getOutInterceptors().add(ash);  
  157.         // 逾時時間設定  
  158.         HTTPConduit http = (HTTPConduit) clientProxy.getConduit();  
  159.         HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();  
  160.         httpClientPolicy.setConnectionTimeout(Integer  
  161.                 .valueOf(webServiceConTimeout));  
  162.         httpClientPolicy.setReceiveTimeout(Integer  
  163.                 .valueOf(webServiceRevTimeout));  
  164.         httpClientPolicy.setAllowChunking(false);  
  165.         http.setClient(httpClientPolicy);  
  166.         //以上插入點逾時設定方式  
  167.         //下面這行代碼是具體調用服務段的deleteTeskTask()  
  168.         CallResult cResult = service.deleteTeskTask("1223");  
  169.         。  
  170.         。  
  171. 用戶端代碼到此結束  
  172. 五,還有一種方式是通過JaxWsProxyFactoryBean方式,注冊攔截器及執行個體化ws,代碼如下:  
  173. private static final JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();  
  174. AddSoapHeader ash = new AddSoapHeader();  
  175.         ArrayList list = new ArrayList();  
  176.         // 添加soap header 資訊  
  177.         list.add(ash);  
  178.         //注入攔截器,getOutInterceptors代表調用服務端時觸發,getInInterceptors就是被調用才觸發  
  179.          factory.setOutInterceptors(list);  
  180.          factory.setServiceClass(HelloWorldService.class);//執行個體化ws  
  181.          factory.setAddress("http://xxx.xxx.xxx.xxx:8004/services/IHelloService");  
  182.          Object obj = factory.create();  
  183.          HelloWorldService service = (HelloWorldService) obj;  
  184.          //下面這行代碼是具體調用服務段的deleteTeskTask()  
  185.         CallResult cResult = service.deleteTeskTask("1223");  
  186. ##########這段代碼可替代步驟(四)#####  
  187. 到此全部工作結束  
  188. 具體一些概念還請自己baidu/google  

繼續閱讀