CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)

下面具体的webservice实现类直接用的是上面的,这里不再说明

CXF拦截器使用,创建一个使用SOAPHeader的安全验证  
xml格式:

1<soap:Header> 2 <auth:authentication xmlns:auth="http://gd.chinamobile.com//authentication"> 3 <auth:systemID>1</auth:systemID> 4 <auth:userID>test</auth:userID> 5 <auth:password>test</auth:password> 6 </auth:authentication> 7</soap:Header>

一,首先在服务端创建一个拦截器(被调用端),需要继承org.apache.cxf.phase.AbstractPhaseInterceptor  

代码如下:  

1import java.util.List; 2 3import javax.xml.soap.SOAPException; 4 5import org.apache.cxf.binding.soap.SoapHeader; 6import org.apache.cxf.binding.soap.SoapMessage; 7import org.apache.cxf.headers.Header; 8import org.apache.cxf.helpers.XMLUtils; 9import org.apache.cxf.interceptor.Fault; 10import org.apache.cxf.phase.AbstractPhaseInterceptor; 11import org.apache.cxf.phase.Phase; 12import org.apache.log4j.Logger; 13import org.w3c.dom.Element; 14import org.w3c.dom.NodeList; 15 16 17public class AuthIntercetpr extends AbstractPhaseInterceptor<SoapMessage> { 18 private static final Logger logger = Logger.getLogger(AuthIntercetpr.class); 19 public static final String xml_namespaceUR_att = "http://gd.chinamobile.com//authentication"; 20 public static final String xml_header_el = "soap:Header"; 21 public static final String xml_authentication_el = "auth:authentication"; 22 public static final String xml_systemID_el = "auth:systemID"; 23 public static final String xml_userID_el = "auth:userID"; 24 public static final String xml_password_el = "auth:password"; 25 public AuthIntercetpr() { 26 // 指定该拦截器在哪个阶段被激发 27 super(Phase.PRE_INVOKE); 28 } 29 30 // 处理消息 31 public void handleMessage(SoapMessage message) { 32 logger.info("==================SoapMessage =" + message); 33 // 获取SOAP消息的全部头 34 List<Header> headers = message.getHeaders(); 35 36 if (null == headers || headers.size() < 1) { 37 throw new Fault(new SOAPException("SOAP消息头格式不对哦!")); 38 } 39 for (Header header : headers) { 40 SoapHeader soapHeader = (SoapHeader) header; 41 // 取出SOAP的Header元素 42 Element element = (Element) soapHeader.getObject(); 43 logger.info("ELEMENT =" + element.toString()); 44 XMLUtils.printDOM(element); 45 NodeList userIdNodes = element 46 .getElementsByTagName(xml_userID_el); 47 NodeList pwdNodes = element 48 .getElementsByTagName(xml_password_el); 49 NodeList systemIdNodes = element 50 .getElementsByTagName(xml_systemID_el); 51 logger.info("############ 打印帐号信息 ##############"); 52 logger.info(userIdNodes.item(0) + "=" 53 + userIdNodes.item(0).getTextContent()); 54 logger.info(systemIdNodes.item(0) + "=" 55 + systemIdNodes.item(0).getTextContent()); 56 logger.info(pwdNodes.item(0) + "=" 57 + pwdNodes.item(0).getTextContent()); 58 logger.info("############————————##############"); 59 if (null != userIdNodes 60 && userIdNodes.item(0).getTextContent().equels("test") ) { 61 if (null != pwdNodes 62 && pwdNodes.item(0).getTextContent().equals("test")) { 63 logger.info("$$$$$$$$ 认证成功"); 64 } else {//认证失败则抛出异常,停止继续操作 65 SOAPException soapExc = new SOAPException("阁下可能不是合法用户!"); 66 throw new Fault(soapExc); 67 } 68 } else {//认证失败则抛出异常,停止继续操作 69 SOAPException soapExc = new SOAPException("阁下可能不是合法用户!"); 70 throw new Fault(soapExc); 71 } 72 73 } 74 } 75}

二,修改cxf-beans.xml 

1<!--id:随意配,implementor:指定接口具体实现类,address:随意配,访问时会用到,下面会做说明--> 2<!--拦截器--> 3<bean id="authIntercetpr" class="unitTest.AuthIntercetpr"></bean> 4<jaxws:endpoint id="HelloWorldService" implementor="com.ws.HelloWorldServiceImpl" 5 address="/IHelloService"> 6 <!-- 在此配置调用当前ws所触发的拦截器--> 7 <jaxws:inInterceptors><ref bean="authIntercetpr" /></bean> 8 9 <!--或者直接在这里写<bean class="unitTest.AuthIntercetpr"></bean>--> 10 </jaxws:inInterceptors> 11</jaxws:endpoint>

到此服务端工作完毕!!!

下面是客户端(调用端)

三,这边同样创建一个拦截器,实现org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor

1import java.text.SimpleDateFormat; 2import java.util.Date; 3import java.util.List; 4 5import javax.xml.namespace.QName; 6 7import org.apache.cxf.binding.soap.SoapHeader; 8import org.apache.cxf.binding.soap.SoapMessage; 9import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; 10import org.apache.cxf.headers.Header; 11import org.apache.cxf.helpers.DOMUtils; 12import org.apache.cxf.helpers.XMLUtils; 13import org.apache.cxf.interceptor.Fault; 14import org.apache.cxf.phase.Phase; 15import org.w3c.dom.Document; 16import org.w3c.dom.Element; 17 18public class AddSoapHeader extends AbstractSoapInterceptor { 19 20 public static final String xml_namespaceUR_att = "http://gd.chinamobile.com//authentication"; 21 public static final String xml_header_el = "soap:Header"; 22 public static final String xml_authentication_el = "auth:authentication"; 23 public static final String xml_systemID_el = "auth:systemID"; 24 public static final String xml_userID_el = "auth:userID"; 25 public static final String xml_password_el = "auth:password"; 26 27 public AddSoapHeader() { 28 // 指定该拦截器在哪个阶段被激发 29 super(Phase.WRITE); 30 } 31 32 public void handleMessage(SoapMessage message) throws Fault { 33 SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 34 Date date = new Date(); 35 String time = sd.format(date); 36 String userId = "test"; 37 String sysId = "1"; 38 String password = "test"; 39 40 QName qname = new QName("RequestSOAPHeader");//这个值暂时不清楚具体做什么用,可以随便写 41 42 Document doc = (Document) DOMUtils.createDocument(); 43 Element root = doc.createElement(xml_header_el); 44 Element eSysId = doc.createElement(xml_systemID_el); 45 eSysId.setTextContent(sysId); 46 Element eUserId = doc.createElement(xml_userID_el); 47 eUserId.setTextContent(userId); 48 Element ePwd = doc.createElement(xml_password_el); 49 ePwd.setTextContent(password); 50 Element child = doc.createElementNS(xml_namespaceUR_att, 51 xml_authentication_el); 52 child.appendChild(eSysId); 53 child.appendChild(eUserId); 54 child.appendChild(ePwd); 55 root.appendChild(child); 56 XMLUtils.printDOM(root);// 只是打印xml内容到控制台,可删除 57 SoapHeader head = new SoapHeader(qname, root); 58 List<Header> headers = message.getHeaders(); 59 headers.add(head); 60 61 } 62 63}

四,具体调用ws的类代码

1private static final String webServiceConTimeout = "6000"; 2private static final String webServiceRevTimeout = "6000"; 3 4HelloWorldServiceImplService hello = new HelloWorldServiceImplService(); 5HelloWorldService service = hello.getHelloWorldServiceImplPort(); 6//以上什么意思请参考:http://learning.iteye.com/admin/blogs/1333223 7Client clientProxy = ClientProxy.getClient(service);//通过目标ws获取代理 8//注入拦截器,getOutInterceptors代表调用服务端时触发,getInInterceptors就是被调用才触发 9clientProxy.getOutInterceptors().add(ash); 10// 超时时间设置 11HTTPConduit http = (HTTPConduit) clientProxy.getConduit(); 12HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 13httpClientPolicy.setConnectionTimeout(Integer 14 .valueOf(webServiceConTimeout)); 15httpClientPolicy.setReceiveTimeout(Integer 16 .valueOf(webServiceRevTimeout)); 17httpClientPolicy.setAllowChunking(false); 18http.setClient(httpClientPolicy); 19//以上插入点超时设置方式 20//下面这行代码是具体调用服务段的deleteTeskTask() 21CallResult cResult = service.deleteTeskTask("1223");

客户端代码到此结束

五,还有一种方式是通过JaxWsProxyFactoryBean方式,注册拦截器及实例化ws,代码如下:

1private static final JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 2 3AddSoapHeader ash = new AddSoapHeader(); 4ArrayList list = new ArrayList(); 5// 添加soap header 信息 6list.add(ash); 7//注入拦截器,getOutInterceptors代表调用服务端时触发,getInInterceptors就是被调用才触发 8 factory.setOutInterceptors(list); 9 factory.setServiceClass(HelloWorldService.class);//实例化ws 10 factory.setAddress("http://xxx.xxx.xxx.xxx:8004/services/IHelloService"); 11 Object obj = factory.create(); 12 HelloWorldService service = (HelloWorldService) obj; 13 //下面这行代码是具体调用服务段的deleteTeskTask() 14CallResult cResult = service.deleteTeskTask("1223");

##########这段代码可替代步骤(四)#####  
  
到此全部工作结束  
具体一些概念还请自己baidu/google

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )