CXF为服务器端和客户端添加自定义拦截器进行权限检查验证并且控制台打印日志(4)
来源:互联网 发布:网络测速360 编辑:程序博客网 时间:2024/06/10 03:47
CXF的拦截器是CXF功能最主要的扩展点。通过自定义的Interceptor,可以改变请求和响应的一些消息处理,其中最基本的原理还是一个动态代理。
Interceptor是CXF架构中一个很有特色的模式。你可以在不对核心模块进行修改的情况下,动态添加很多功能。这对于CXF这个以处理消息为中心的服务框架来说是非常有用的,CXF通过在Interceptor中对消息进行特殊处理,实现了很多重要功能模块,例如:日志记录,Soap消息处理,消息的压缩处理。
CXF拦截器使用如下
1:服务端增加自定义拦截器
package com.lzw.springcxf.auth;import java.util.List;import org.apache.cxf.binding.soap.SoapMessage;import org.apache.cxf.headers.Header;import org.apache.cxf.interceptor.Fault;import org.apache.cxf.phase.AbstractPhaseInterceptor;import org.apache.cxf.phase.Phase;import org.w3c.dom.Element;import org.w3c.dom.NodeList;/** * @Description: 自定义拦截器在哪个阶段实施拦截 * @author lzw * @date 2013年11月6日 上午11:54:48 * @version V1.0 * @Copyright (c) */public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {public AuthInterceptor() {//拦截器在调用方法之前拦截SOAP消息super(Phase.PRE_INVOKE);} /** * @Description: 拦截器操作 * @param msg 被拦截到的SOAP消息 * @throws Fault */@Overridepublic void handleMessage(SoapMessage msg) throws Fault {System.out.println("=====自定义拦截器=======");//获取SOAP消息的HeaderList<Header> headers = msg.getHeaders(); //如果没有Headerif(headers == null || headers.size() < 1) {throw new Fault(new IllegalArgumentException("没有Header,拦截器实施拦截"));}//获取Header携带是用户和密码信息Header firstHeader = headers.get(0);Element ele = (Element) firstHeader.getObject();NodeList userIdEle = ele.getElementsByTagName("userId");NodeList userPassEle = ele.getElementsByTagName("userPass");if (userIdEle.getLength() != 1) {throw new Fault(new IllegalArgumentException("用户Id格式不对"));}if (userPassEle.getLength() != 1) {throw new Fault(new IllegalArgumentException("用户密码格式不对"));}//获取元素的文本内容String userId = userIdEle.item(0).getTextContent();String userPass = userPassEle.item(0).getTextContent();if (!userId.equals("lzw") || !userPass.equals("123456")) {throw new Fault(new IllegalArgumentException("用户和密码不正确"));}}}applicationContext.xml 配置
<jaxws:endpoint implementor="#handleService" address="/cxf"> <!-- 配置IN拦截器 --> <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> <bean class="com.lzw.springcxf.auth.AuthInterceptor"></bean> </jaxws:inInterceptors> <!-- 配置OUT拦截器 --> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> </jaxws:outInterceptors> </jaxws:endpoint>
客户端代码:
定义客户端拦截器
package com.lzw.springcxf.client;import java.util.List;import javax.xml.namespace.QName;import org.apache.cxf.binding.soap.SoapMessage;import org.apache.cxf.headers.Header;import org.apache.cxf.helpers.DOMUtils;import org.apache.cxf.interceptor.Fault;import org.apache.cxf.phase.AbstractPhaseInterceptor;import org.apache.cxf.phase.Phase;import org.w3c.dom.Document;import org.w3c.dom.Element;public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage>{ private String userId;private String userPass;public AddHeaderInterceptor(String userId, String userPass) {super(Phase.PREPARE_SEND);this.userId = userId;this.userPass = userPass;}@Overridepublic void handleMessage(SoapMessage msg) throws Fault {List<Header> headers = msg.getHeaders();//创建Document对象Document doc = DOMUtils.createDocument();Element ele = doc.createElement("authHeader");//配置服务器端Head信息的用户密码Element eleId= doc.createElement("userId");eleId.setTextContent(userId);Element elePass = doc.createElement("userPass");elePass.setTextContent(userPass);ele.appendChild(eleId);ele.appendChild(elePass);/** * 生成的XML文档 * <authHeader> * <userId>lzw</userId> * <userPass>123456</userPass> * </authHeader> */headers.add(new Header(new QName(""), ele));}}
客户端调用:
package com.lzw.springcxf.client;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import org.apache.cxf.endpoint.Client;import org.apache.cxf.frontend.ClientProxy;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import com.lzw.springcxf.service.ClubModel;import com.lzw.springcxf.service.Entry;import com.lzw.springcxf.service.HandleService;import com.lzw.springcxf.service.PlayerModel;import com.lzw.springcxf.service.StringPlayer;import com.lzw.springcxf.service.impl.HandleServiceTest;public class WSClient { public static void main(String[] args) throws IOException {HandleServiceTest factory = new HandleServiceTest();HandleService handleService = factory.getHandleServiceImplPort();Client client = ClientProxy.getClient(handleService);client.getOutInterceptors().add(new AddHeaderInterceptor("lzw", "123456"));client.getOutInterceptors().add(new LoggingOutInterceptor(new PrintWriter(new FileWriter("in.txt"))));client.getInInterceptors().add(new LoggingInInterceptor(new PrintWriter(new FileWriter("out.txt"))));System.out.println(handleService.sayName("内马尔"));ClubModel clubModel = new ClubModel();clubModel.setClubId(1111);clubModel.setClubName("巴塞罗那");clubModel.setCountry("西班牙");System.out.println("============================");List<PlayerModel> players = handleService.getPlayerByClub(clubModel);for (PlayerModel play:players) {System.out.println(play.getPlayerName());}System.out.println("============================");StringPlayer allPlayer = handleService.getAllPlayers();for (Entry entry:allPlayer.getEntries()) { System.out.println(entry.getKey() + entry.getValue().getPlayerName()); }}}
至此服务端打印信息
ID: 5Address: http://localhost:8080/Spring-Cxf-Demo/lzw/cxfEncoding: UTF-8Http-Method: POSTContent-Type: text/xml; charset=UTF-8Headers: {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]}Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><authHeader><userId>lzw</userId><userPass>123456</userPass></authHeader></soap:Header><soap:Body><ns2:getAllPlayers xmlns:ns2="http://service.springcxf.lzw.com/"/></soap:Body></soap:Envelope>--------------------------------------=====自定义拦截器=======2013-11-6 14:50:51 org.apache.cxf.services.handleServiceTest.HandleServiceImplPort.HandleService信息: Outbound Message---------------------------ID: 5Encoding: UTF-8Content-Type: text/xmlHeaders: {}Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getAllPlayersResponse xmlns:ns2="http://service.springcxf.lzw.com/"><return><entries><key>第4位球员是:</key><value><playerId>4</playerId><playerName>贝尔</playerName><playerNumber>11</playerNumber><playerPosition>中场</playerPosition></value></entries><entries><key>第3位球员是:</key><value><playerId>3</playerId><playerName>C罗</playerName><playerNumber>7</playerNumber><playerPosition>前锋</playerPosition></value></entries><entries><key>第1位球员是:</key><value><playerId>1</playerId><playerName>梅西</playerName><playerNumber>10</playerNumber><playerPosition>前锋</playerPosition></value></entries><entries><key>第2位球员是:</key><value><playerId>2</playerId><playerName>内马尔</playerName><playerNumber>11</playerNumber><playerPosition>前锋</playerPosition></value></entries></return></ns2:getAllPlayersResponse></soap:Body></soap:Envelope>--------------------------------------
结束:
相关代码:http://download.csdn.net/detail/lzwjavaphp/6511489
- CXF为服务器端和客户端添加自定义拦截器进行权限检查验证并且控制台打印日志(4)
- CXF:为服务器端和客户端添加自定义拦截器进行权限检查验证并且控制台打印日志
- CXF-06:Web Service暴露后如何进行权限控制,CXF拦截器的理论以及如何为CXF的客户端和服务器端添加拦截器
- 【WebService】7.为CXF的客户端和服务器端添加拦截器
- CXF-08:自定义CXF拦截器来进行权限控制
- 用CXF编写基于spring的web service 并添加cxf日志拦截器和自定义拦截器
- CXF添加自定义拦截器
- CXF添加自定义拦截器
- CXF自定义拦截器实现权限控制
- 使用CXF为Web Service添加拦截器,自定义拦截器
- CXF客户端添加拦截器报错
- webservice利用cxf框架编写日志拦截器和自定义拦截器
- Java CXF WebService框架 集成Spring3 自定义拦截器进行头验证
- CXF与Spring集成:自定义验证权限以及日志记录
- OkHttp拦截请求与相应,以及控制台打印日志(Interceptor拦截器)
- 自定义验证类(客户端和服务器端同时验证,支持Ajax验证)[开源]
- WebService(7)_Apache CXF拦截器-权限管理-登录验证
- CXF添加拦截器
- 缓存思想分析
- JEECG 移动端解决方案【HTML5】
- Oracle数据库优化
- iPhone各个控件尺寸
- u-boot向linux内核传递启动参数
- CXF为服务器端和客户端添加自定义拦截器进行权限检查验证并且控制台打印日志(4)
- STM32之端口复用与重映射简单说明
- Magento - 开启模板路径提示
- ligerUI有关ligerLayout,ligerAccordion,ligerTab的JS语句位置颠倒导致错误的解决方法
- Oracle散记
- Android SDK Manager更新不了的解决办法
- JS判断 不能为空
- /etc/ld.so.conf详解
- (转帖)总结我这10年来的创业吐血经验