CXF:为服务器端和客户端添加自定义拦截器进行权限检查验证并且控制台打印日志

CXF的拦截器是CXF功能最主要的扩展点。通过自定义的Interceptor,可以改变请求和响应的一些消息处理,其中最基本的原理还是一个动态代理。
 

Interceptor是CXF架构中一个很有特色的模式。你可以在不对核心模块进行修改的情况下,动态添加很多功能。这对于CXF这个以处理消息为中心的服务框架来说是非常有用的,CXF通过在Interceptor中对消息进行特殊处理,实现了很多重要功能模块,例如:日志记录,Soap消息处理,消息的压缩处理。


CXF拦截器使用如下

1:服务端增加自定义拦截器

[java]  view plain  copy
 print ?
  1. package com.lzw.springcxf.auth;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.cxf.binding.soap.SoapMessage;  
  6. import org.apache.cxf.headers.Header;  
  7. import org.apache.cxf.interceptor.Fault;  
  8. import org.apache.cxf.phase.AbstractPhaseInterceptor;  
  9. import org.apache.cxf.phase.Phase;  
  10. import org.w3c.dom.Element;  
  11. import org.w3c.dom.NodeList;  
  12.   
  13. /**   
  14.  * @Description: 自定义拦截器在哪个阶段实施拦截 
  15.  * @author lzw 
  16.  * @date 2013年11月6日 上午11:54:48 
  17.  * @version V1.0 
  18.  * @Copyright (c) 
  19.  */  
  20. public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {  
  21.   
  22.     public AuthInterceptor() {  
  23.         //拦截器在调用方法之前拦截SOAP消息  
  24.         super(Phase.PRE_INVOKE);  
  25.     }  
  26.       
  27.     /** 
  28.      * @Description: 拦截器操作 
  29.      * @param msg 被拦截到的SOAP消息 
  30.      * @throws Fault 
  31.      */  
  32.     @Override  
  33.     public void handleMessage(SoapMessage msg) throws Fault {  
  34.           
  35.         System.out.println("=====自定义拦截器=======");  
  36.         //获取SOAP消息的Header  
  37.         List<Header> headers = msg.getHeaders();  
  38.         //如果没有Header  
  39.         if(headers == null || headers.size() < 1) {  
  40.             throw new Fault(new IllegalArgumentException("没有Header,拦截器实施拦截"));  
  41.         }  
  42.         //获取Header携带是用户和密码信息  
  43.         Header firstHeader = headers.get(0);  
  44.         Element ele = (Element) firstHeader.getObject();  
  45.           
  46.         NodeList userIdEle = ele.getElementsByTagName("userId");  
  47.         NodeList userPassEle = ele.getElementsByTagName("userPass");  
  48.           
  49.         if (userIdEle.getLength() != 1) {  
  50.             throw new Fault(new IllegalArgumentException("用户Id格式不对"));  
  51.         }  
  52.               
  53.         if (userPassEle.getLength() != 1) {  
  54.             throw new Fault(new IllegalArgumentException("用户密码格式不对"));  
  55.         }  
  56.           
  57.         //获取元素的文本内容  
  58.         String userId = userIdEle.item(0).getTextContent();  
  59.         String userPass = userPassEle.item(0).getTextContent();  
  60.           
  61.         if (!userId.equals("lzw") || !userPass.equals("123456")) {  
  62.             throw new Fault(new IllegalArgumentException("用户和密码不正确"));  
  63.         }  
  64.     }  
  65.   
  66. }  
applicationContext.xml 配置

[java]  view plain  copy
 print ?
  1. <jaxws:endpoint   
  2.         implementor="#handleService"   
  3.         address="/cxf">  
  4.         <!-- 配置IN拦截器 -->  
  5.         <jaxws:inInterceptors>  
  6.             <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>  
  7.             <bean class="com.lzw.springcxf.auth.AuthInterceptor"></bean>  
  8.         </jaxws:inInterceptors>  
  9.         <!-- 配置OUT拦截器 -->  
  10.         <jaxws:outInterceptors>  
  11.             <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>  
  12.         </jaxws:outInterceptors>  
  13.     </jaxws:endpoint>  


客户端代码:



定义客户端拦截器


[java]  view plain  copy
 print ?
  1. package com.lzw.springcxf.client;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.xml.namespace.QName;  
  6.   
  7. import org.apache.cxf.binding.soap.SoapMessage;  
  8. import org.apache.cxf.headers.Header;  
  9. import org.apache.cxf.helpers.DOMUtils;  
  10. import org.apache.cxf.interceptor.Fault;  
  11. import org.apache.cxf.phase.AbstractPhaseInterceptor;  
  12. import org.apache.cxf.phase.Phase;  
  13. import org.w3c.dom.Document;  
  14. import org.w3c.dom.Element;  
  15.   
  16. public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage>{  
  17.       
  18.     private String userId;  
  19.     private String userPass;  
  20.       
  21.     public AddHeaderInterceptor(String userId, String userPass) {  
  22.         super(Phase.PREPARE_SEND);  
  23.         this.userId = userId;  
  24.         this.userPass = userPass;  
  25.     }  
  26.   
  27.     @Override  
  28.     public void handleMessage(SoapMessage msg) throws Fault {  
  29.           
  30.         List<Header> headers = msg.getHeaders();  
  31.         //创建Document对象  
  32.         Document doc = DOMUtils.createDocument();  
  33.         Element ele = doc.createElement("authHeader");  
  34.         //配置服务器端Head信息的用户密码  
  35.         Element eleId= doc.createElement("userId");  
  36.         eleId.setTextContent(userId);  
  37.         Element elePass = doc.createElement("userPass");  
  38.         elePass.setTextContent(userPass);  
  39.           
  40.         ele.appendChild(eleId);  
  41.         ele.appendChild(elePass);  
  42.         /** 
  43.          * 生成的XML文档 
  44.          * <authHeader> 
  45.          *      <userId>lzw</userId> 
  46.          *      <userPass>123456</userPass> 
  47.          * </authHeader> 
  48.          */  
  49.         headers.add(new Header(new QName(""), ele));  
  50.     }  
  51.   
  52. }  


客户端调用:

[java]  view plain  copy
 print ?
  1. package com.lzw.springcxf.client;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileWriter;  
  5. import java.io.IOException;  
  6. import java.io.PrintWriter;  
  7. import java.util.List;  
  8.   
  9. import org.apache.cxf.endpoint.Client;  
  10. import org.apache.cxf.frontend.ClientProxy;  
  11. import org.apache.cxf.interceptor.LoggingInInterceptor;  
  12. import org.apache.cxf.interceptor.LoggingOutInterceptor;  
  13.   
  14. import com.lzw.springcxf.service.ClubModel;  
  15. import com.lzw.springcxf.service.Entry;  
  16. import com.lzw.springcxf.service.HandleService;  
  17. import com.lzw.springcxf.service.PlayerModel;  
  18. import com.lzw.springcxf.service.StringPlayer;  
  19. import com.lzw.springcxf.service.impl.HandleServiceTest;  
  20.   
  21. public class WSClient {  
  22.       
  23.     public static void main(String[] args) throws IOException {  
  24.           
  25.         HandleServiceTest factory = new HandleServiceTest();          
  26.         HandleService handleService = factory.getHandleServiceImplPort();  
  27.       
  28.         Client client = ClientProxy.getClient(handleService);  
  29.         client.getOutInterceptors().add(new AddHeaderInterceptor("lzw""123456"));  
  30.         client.getOutInterceptors().add(new LoggingOutInterceptor(new PrintWriter(new FileWriter("in.txt"))));  
  31.         client.getInInterceptors().add(new LoggingInInterceptor(new PrintWriter(new FileWriter("out.txt"))));  
  32.         System.out.println(handleService.sayName("内马尔"));  
  33.         ClubModel clubModel = new ClubModel();  
  34.         clubModel.setClubId(1111);  
  35.         clubModel.setClubName("巴塞罗那");  
  36.         clubModel.setCountry("西班牙");  
  37.         System.out.println("============================");  
  38.         List<PlayerModel> players = handleService.getPlayerByClub(clubModel);  
  39.         for (PlayerModel play:players) {  
  40.             System.out.println(play.getPlayerName());  
  41.         }  
  42.         System.out.println("============================");  
  43.         StringPlayer allPlayer = handleService.getAllPlayers();  
  44.         for (Entry entry:allPlayer.getEntries()) {  
  45.             System.out.println(entry.getKey() + entry.getValue().getPlayerName());  
  46.         }  
  47.     }  
  48. }  


至此服务端打印信息

[java]  view plain  copy
 print ?
  1. ID: 5  
  2. Address: http://localhost:8080/Spring-Cxf-Demo/lzw/cxf  
  3. Encoding: UTF-8  
  4. Http-Method: POST  
  5. Content-Type: text/xml; charset=UTF-8  
  6. Headers: {Accept=[*/*], cache-control=[no-cache], connection=[keep-alive], Content-Length=[274], content-type=[text/xml; charset=UTF-8], host=[localhost:8080], pragma=[no-cache], SOAPAction=[""], user-agent=[Apache CXF 2.7.6]}  
  7. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
  8. <soap:Header><authHeader>  
  9. <userId>lzw</userId><userPass>123456</userPass>  
  10. </authHeader></soap:Header><soap:Body>  
  11. <ns2:getAllPlayers xmlns:ns2="http://service.springcxf.lzw.com/"/></soap:Body></soap:Envelope>  
  12. --------------------------------------  
  13. =====自定义拦截器=======  
  14. 2013-11-6 14:50:51 org.apache.cxf.services.handleServiceTest.HandleServiceImplPort.HandleService  
  15. 信息: Outbound Message  
  16. ---------------------------  
  17. ID: 5  
  18. Encoding: UTF-8  
  19. Content-Type: text/xml  
  20. Headers: {}  
  21. Payload:   
  22. <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
  23. <soap:Body><ns2:getAllPlayersResponse xmlns:ns2="http://service.springcxf.lzw.com/">  
  24. <return><entries><key>第4位球员是:</key><value><playerId>4</playerId><playerName>贝尔</playerName>  
  25. <playerNumber>11</playerNumber><playerPosition>中场</playerPosition></value></entries><entries>  
  26. <key>第3位球员是:</key><value><playerId>3</playerId><playerName>C罗</playerName>  
  27. <playerNumber>7</playerNumber><playerPosition>前锋</playerPosition></value>  
  28. </entries><entries><key>第1位球员是:</key><value><playerId>1</playerId>  
  29. <playerName>梅西</playerName><playerNumber>10</playerNumber><playerPosition>前锋</playerPosition>  
  30. </value></entries><entries><key>第2位球员是:</key><value><playerId>2</playerId><playerName>内马尔</playerName>  
  31. <playerNumber>11</playerNumber><playerPosition>前锋</playerPosition></value></entries></return>  
  32. </ns2:getAllPlayersResponse></soap:Body></soap:Envelope>  
  33. --------------------------------------  

结束:

相关代码:http://download.csdn.net/detail/lzwjavaphp/6511489

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值