【webservice】基于axis2设计带soaphead安全机制的webservice服务端

还是用axis2写的。是先有客户端,再有这个服务端,严格根据客户端的请求报文来写的哦。是否解决了“ 先有鸡还是先有蛋”的问题。。报文的话,请参照我的上一篇博文《【webservice】调试方法篇(二)》,那么,我的编程步骤是这样的。

1、新建java工程,导入axis2的包、dom4j工具包。

2、根据客户端的请求报文上面soap的命名空间,为工程设计包名,因此,本工程的供外部调用类(Server类)的所在包是cn.com.ultrapower.webservice.service。

3、编辑配置文件services.xml如下:

<!-- webservice配置文件   -->
<service name="Prc_Service" >
	<description>
		Please Type your service description here
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		<messageReceiver  mep="http://www.w3.org/2004/08/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</messageReceivers>
	<parameter name="ServiceClass">cn.com.ultrapower.webservice.service.Server</parameter>
</service>

4、根据客户端的请求报文上面soap的请求方法,定义Server类里面的对外方法是SendXML(String requestXml,String busiKey)。根据报文可知道:<soapenv:Header>的参数是username与password,<soapenv:body>的参数是busiKey(请求的业务)与requestXml(请求的业务的查询参数,xml格式,需要dom4j分析)。

5、其他工具类设计:用于加载关于业务码busiKey的map的InitBusiKey.java,

6、其他工具类设计:用于加载user的账号密码、接口权限、接口流量等配置信息的InitUser.java,

下面提供Server类的全部代码:

package cn.com.ultrapower.webservice.service;

import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.soap.SOAPHeader;
import org.apache.axis2.context.MessageContext;
import org.dom4j.DocumentException;

import cn.com.ultrapower.webservice.service.conf.InitBusiKey;
import cn.com.ultrapower.webservice.service.conf.InitUser;
import cn.com.ultrapower.webservice.service.service.CRBT_Service;
import cn.com.ultrapower.webservice.service.service.ISAG_Service;
import cn.com.ultrapower.webservice.service.service.MMSC_Service;
import cn.com.ultrapower.webservice.service.service.WAPGW_Service;

public class Server{
	//userFlowMap是累加用户在单位时间里对某接口的访问次数
	private static Map<String, Long[]> userFlowMap = new HashMap<String, Long[]>();//String为用户名username,Long[0]为时间,Long[1]为次数
	String responseCode = "";  //查询服务返回的状态码
	String responseXML = "";  //查询服务返回的业务数据
	/*
	 * @para busiKey :     业务平台标识
	 * @para requestXml :  查询条件的XML字符串
	 * 定义返回码responseCode:
		001	输入参数的busiKey无效
		004	请求方权限验证失败
		003	查询接口达到最大并发能力
		002	输入参数的requestXML无效
		005	请求的查询时间超时
		999	其它错误
		000	服务接口处理成功
	 * */
	public String SendXML (String requestXml,String busiKey){
		try{
			String serviceName = InitBusiKey.getInitBusiKey().getServiceName(busiKey);
			if(serviceName!=null && !serviceName.equals("") && serviceName.length()>0){
				String Username = checkAuth(serviceName);
				if(Username!=null && !Username.equals("")){
					if(checkFlow(Username)){
						responseCode = "000";	//000:服务接口处理成功
						responseXML = readRequestXml(serviceName,requestXml);
						String returnData = returnData();
						return returnData;
					}else{
						responseCode = "003";	//003:查询接口达到最大并发能力
						responseXML = "";
						String returnData = returnData();
						return returnData;
					}
				}else{
					responseCode = "004";	//004:请求方权限验证失败
					responseXML = "";
					String returnData = returnData();
					return returnData;
				}
			}else{
				responseCode = "001";	//001:输入参数的busiKey无效
				responseXML = "";
				String returnData = returnData();
				return returnData;
			}
		}catch(NumberFormatException e){//002:参数string转int出错(参数requestXML无效)
			e.printStackTrace();
			responseCode = "002";
			responseXML = "";
			String returnData = returnData();
			return returnData;
		}catch(NullPointerException e){//002:参数为空时出错((参数requestXML无效))
			e.printStackTrace();
			responseCode = "002";
			responseXML = "";
			String returnData = returnData();
			return returnData;
		}catch(Exception e){
			e.printStackTrace();
			responseCode = "999";	//999:其它错误
			responseXML = "";
			String returnData = returnData();
			return returnData;
		}
	}

	private String returnData(){
		StringBuffer returnData = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		returnData.append("<root>");
		returnData.append("<responseCode>"); returnData.append(responseCode); returnData.append("</responseCode>");
		returnData.append("<responseXML>"); returnData.append(responseXML); returnData.append("</responseXML>");
		returnData.append("</root>");
		return returnData.toString();
	}

	//检测用户账号及接口权限(soaphead安全机制)
	private String checkAuth(String serviceName){
		boolean pwIsOK = false;
		boolean authIsOK = false;
		String Username="",Password="",Address="",Province="";
		MessageContext msgContext = MessageContext.getCurrentMessageContext();
		SOAPHeader header = msgContext.getEnvelope().getHeader();
		Iterator list = header.getChildren();
		while (list.hasNext()){
		    OMElement element = (OMElement) list.next();
		    if (element.getLocalName().equals("Username")){
			    Username = element.getText();
			}
			if (element.getLocalName().equals("Password")){
		        Password = element.getText();
		    }
		}
		if(Password.equals(InitUser.getInitUser().getUser(Username).getPassword())) pwIsOK=true;
		if(InitUser.getInitUser().getUser(Username).getServiceAuth().contains((","+serviceName+","))) authIsOK=true;
		System.out.println("step1.checkAuth >>>>>>>>> pwIsOK:"+pwIsOK+" authIsOK:"+authIsOK);
		if(pwIsOK && authIsOK) return Username;
		else return "";
	}

	//控制用户查询频率(接口流量)
	private boolean checkFlow(String Username){
		boolean flowIsOK = true;
		long nowTime = Calendar.getInstance().getTime().getTime();
		if(userFlowMap.get(Username)==null){
			Long[] userflow = {nowTime,1L};	//userflow[0]为初始时间,userflow[1]为期间访问次数
			userFlowMap.put(Username, userflow);
			flowIsOK = true;
		}else if(nowTime>(userFlowMap.get(Username)[0]+60000)){
			Long[] userflow = {nowTime,1L};	//userflow[0]为初始时间,userflow[1]为期间访问次数
			userFlowMap.put(Username, userflow);
			flowIsOK = true;
		}else if(userFlowMap.get(Username)[0]<=nowTime && nowTime<=(userFlowMap.get(Username)[0]+60000)){
			if(userFlowMap.get(Username)[1]<InitUser.getInitUser().getUser(Username).getFlowIn1Min()){
				Long[] userflow = {userFlowMap.get(Username)[0],userFlowMap.get(Username)[1]+1};//访问次数+1
				userFlowMap.put(Username, userflow);
				flowIsOK = true;
			}else{
				flowIsOK = false;
			}
		}
		System.out.println("step2.checkFlow >>>>>>>>> flowIsOK:"+flowIsOK);
		return flowIsOK;
	}

	//执行查询服务
	private String readRequestXml(String serviceName,String requestXml) throws DocumentException,NumberFormatException, NullPointerException, UnsupportedEncodingException{
		System.out.println("step3.readRequestXml >>>>>>>>> serviceName: "+serviceName);
		//选择对应的service
		if(serviceName.equals("WAPGW"))  return new WAPGW_Service().readXML(requestXml);
		if(serviceName.equals("MMSC"))  return new MMSC_Service().readXML(requestXml);
		if(serviceName.equals("ISAG"))  return new ISAG_Service().readXML(requestXml);
		if(serviceName.equals("CRBT"))  return new CRBT_Service().readXML(requestXml);
		else return "";
	}

}

一百几十行代码,有没有看的晕晕的?希望你能够耐心地理解到这段代码,更希望这段代码能给你带来帮助!

用axis2用得时间长了,自己也希望有些突破。前阵子重写了这段业务,完全放弃了axis2,直接弄了个servlet,也就是javaweb系统,小巧呢,直接扔到tomcat的webapps就能跑了,用上一篇博文《【webservice】调试方法篇(二)》上面的源码测试,是没问题的。但是,没能及时联系到客户端厂家联调了,因为,我已经申请离职了。今天是在公司的最后一天,就偷闲整理了webservice的系列博文,希望能给大家带来帮助吧。入行不深,且祝我前程似锦吧~

转载请说明出自whilejolly:http://blog.csdn.net/seedingly/article/details/39055107

时间: 2024-09-29 18:10:08

【webservice】基于axis2设计带soaphead安全机制的webservice服务端的相关文章

c++ 网络编程(四)TCP/IP LINUX/windows下 socket 基于I/O复用的服务器端代码 解决多进程服务端创建进程资源浪费问题

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,继上一篇说到多进程服务端也是有缺点的,每创建一个进程就代表大量的运算与内存空间占用,相互进程数据交换也很麻烦. 本章的I/O模型就是可以解决这个问题的其中一种模型...废话不多说进入主题-- I/O复用技术主要就是select函数的使用. 一.I/O复用预备知识--select()函数用法与作用 select()用来确定一个或多个套接字的状态(更为本质一点来讲是文

基于NIO的消息路由的实现(四) 服务端通讯主线程(2)断包和粘包的处理

本来我打算单独开一章,专门说明粘包和断包,但是觉得这个事儿我在做的时候挺头疼的,但是对于别人或许不那么重要,于是就在这里写吧. 那么何谓粘包.何谓断包呢? 粘包:我们知道客户端在写入报文给服务端的时候,首先要将需要写入的内容写入Buffer,以ByteBuffer为例,如果你Buffer定义的足够大,并且你发送的报文足够快,此时就会产生粘包现象,举例来说 你发送一个 报文" M|A",然后你有发送了一个"M|B",如果产生粘包,服务端从缓冲区里面读出的就是"

基于NIO的消息路由的实现(四) 服务端通讯主线程(1)

一.简单介绍: 服务端通讯主线程是消息路由服务的启动类,其主要作用如下: 1.初始化相关配置: 2.根据配置的ip和port创建tcp服务: 3.接收客户端连接,并给客户端分配令牌: 4.接收客户端的登录请求,并将客户端相关信息(令牌.客户端登录标识.最后访问时间.当前token所使用的通道,保存到缓冲区) 5.接收客户端的报文请求,并添加到通讯队列,等待处理: 6.接收来自各处的指令发送请求,并发送至相关通道: 二.详细介绍: 1.启动方法:首先加载配置信息:然后启动主线程.通讯报文消费线程(

CCBPM中的消息机制,CCIM服务端安装说明

1.修改LeeIMService.exe.config服务端配置文件: 2.客户端的配置就比较简单了,只需要在"SercerIP"节点上写上服务器的IP: 3.然后要说的就是各项端口: Msg_UDP_Port:发消息的UDP端口: MSG_TCP_Port:发消息的TCP端口: File_TCP_Port:传文件的TCP端口: File_UDP_Port:传文件的UDP端口: AV_UDP_Port:视频UDP端口; AV_TCP_Port:视频TCP端口: 这些端口都需要映射好,不

webservice -- cxf客户端调用axis2服务端

背景: 有个项目, 需要由第三方提供用户信息, 实现用户同步操作, 对方给提供webservice接口(axis2实现)并也使用axis2作主客户端调用我方提供的webservice接口 起初, 由于项目使用了spring, 且spring可与cxf较好的集成, 所以也就选用了cxf, 可问题随之出现, 接口可以调用到, 接口的具体方法也可以调用到, 但是, 1. cxf作为客户端, 获取服务端返回值时均为null. 2. cxf作为服务端, 获取axis2客户端传来的参数时, 也均为null.

webService服务端和客户端开发 简单实例

这几天一直在看webService相关的知识. webService是一个跨平台访问的第三方插件,方便易用,多平台使用. 开发中我们可能自己是服务端,提供webService接口给别人访问我们的系统:也有可能我们调用别人的webService接口去访问别人的系统(比如查询天气预报). 下面是服务端和客户端的开发,实际开发中我们只是其中一方. 服务端开发: ①创建一个服务类,运行main方法发布即可,服务端就开发完成了. package com.lijianbo.service; import j

基于vue的nuxt框架cnode社区服务端渲染

nuxt-cnode 基于vue的nuxt框架仿的cnode社区服务端渲染,主要是为了seo优化以及首屏加载速度 线上地址 http://nuxt-cnode.foreversnsd.cngithub地址 https://github.com/Kim09AI/nu... 技术栈 vue vue-router vuex nuxt axios simplemde ES6/7 stylus 目录结构 ├─npm-shrinkwrap.json ├─nuxt.config.js # nuxt配置文件 ├

【webservice】发布axis2的webservice服务端

axis2版本:axis2-1.5.4 准备工作:下载axis2-1.5.4-war.zip(生成服务端).axis2-1.5.4-bin.zip(axis2的jar包),jdk5(及以上版本).tomcat(端口我设成8086了) 手把手超级详细介绍axis2的webservice服务端的生成与发布. 1. 解压axis2-1.5.4-war.zip得axis2.war,把axis2.war放到tomcat的webapps目录, 启动tomcat就能加载axis2.war并生成新的axis2目

webservice的Axis2入门教程java版

本文转自百度文库 Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物.Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring.JSON等技术.这些都将在后面的系列教程中讲解.在本文中主要介绍了如何使用Axis2开发一个不需要任何配置文件的WebService,并在客户端使用Java和C#调用这个WebService. 一.Axis2的下载和安装 读者可以从如下的网址下载Axis2的最新版本: