江西先锋软件职业技术学院.docx
《江西先锋软件职业技术学院.docx》由会员分享,可在线阅读,更多相关《江西先锋软件职业技术学院.docx(16页珍藏版)》请在冰点文库上搜索。
江西先锋软件职业技术学院
江西先锋软件职业技术学院
毕业设计报告
题目:
基于soap协议的综合信息管理系统
姓名:
万兵班级:
先锋十三班
专业:
信息安全
届别:
04届
指导教师:
江海
2006年6月24日
基于soap协议的综合信息管理系统
随着计算机技术的不断发展,现代企业面临的环境越来越复杂,
其客户需求的信息系统大多想采用能跨越多操作系统、多种语言平台、能够支持多种连接方式、数据易于共享的综合信息管理系统。
通过在学校两年的学习以及江老师的辅导,我在学习期间了解到了soap协议,并与先锋学院科研处联合开发了先锋学院综合信息管理系统。
先锋学院综合信息管理系统是基于javaWebservices的soap协议来统一实现数据访问的。
这让我们的系统有了以下的特点。
-、系统特点介绍
简单性
以前的系统都会在数据库的访问上花费大量的时间去编码,我们的由于该系统采用统一的消息模式来管理数据库的信息,所以使得编码变得非常的简单,而且基本上是一致的,大大减少了程序员在数据库的访问上花费的时间。
可扩展性
以前用java开发的系统不论是用到什么架构,在数据库改动以后都要对系统进行较大的更改,并且改动后的数据不容易集成到现有的系统中。
才用我们的这个设计方法在遇到上述情况只要你修改sql语句,和必要的文档后就能直接对系统进行修改。
没必要修改程序中的方法或类。
安全性
在有别人想基于我们的系统再开发一个系统的时候我们没必要把我们的数据库结构公布出来,只要对方按照我们规范给我们发消息就能取得相应的数据。
对方对于我们提供的交易是怎样实现的完全不了解。
这样就能防止外人在了解到你的数据库结构后对你的数据进行有针对性的攻击。
性能好
有些系统中可能存在以下的结构:
每个服务都会单独去访问数据库,这样频繁的对数据的操作很有可能会导致数据库性能上出问题,而且您不能保证每个应用程序的操作都是合理的,也许有些程序没有及时的释放资源就会导致数据库资源的大量浪费,直接影响性能。
我们的系统采用一个基于soap的axis主机实现对数据库的统一访问,这样可以有效的控制别的主机直接对数据库的操作,我们也就可以通过对Axis主机上的代码进行优化来解决由于程序带来的大量资源消耗的问题。
我们只要保证Axis主机不出问题,web上或应用程序出问题不会直接导致数据库的死机。
以下是我们交易的流程图:
二、什么是SOAP?
SOAP(SimpleObjectAccessProtocol)简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:
SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encodingrules),用于表示应用程序需要使用的数据类型的实例;SOAPRPC表示(RPCrepresentation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。
虽然这四个部分都作为SOAP的一部分,作为一个整体定义的,但他们在功能上是相交的、彼此独立的。
特别的,信封和编码规则是被定义在不同的XML命名空间(namespace)中,这样使得定义更加简单。
SOAP的两个主要设计目标是简单性和可扩展性。
这就意味着有一些传统消息系统或分布式对象系统中的某些性质将不是SOAP规范的一部分。
比如:
分布式垃圾收集(Distributedgarbagecollection)、成批传送消息(Boxcarringorbatchingofmessages)、对象引用(Objects-by-reference(whichrequiresdistributedgarbagecollection))、对象激活(Activation(whichrequiresobjects-by-reference))。
SOAP=RPC+HTTP+XMLSOAP简单的理解,就是这样的一个开放协议SOAP=RPC+HTTP+XML:
采用HTTP作为底层通讯协议;RPC作为一致性的调用途径,XML作为数据传送的格式,允许服务提供者和服务客户经过防火墙在INTERNET进行通讯交互。
RPC的描叙可能不大准确,因为SOAP一开始构思就是要实现平台与环境的无关性和独立性,每一个通过网络的远程调用都可以通过SOAP封装起来,包括DCE(DistributedComputingEnvironment) RPCCALLS,COM/DCOMCALLS,CORBACALLS,JAVACALLS,etc。
SOAP使用HTTP传送XML,尽管HTTP不是有效率的通讯协议,而且XML还需要额外的文件解析(parse),两者使得交易的速度大大低于其它方案。
但是XML是一个开放、健全、有语义的讯息机制,而HTTP是一个广泛又能避免许多关于防火墙的问题,从而使SOAP得到了广泛的应用。
但是如果效率对你来说很重要,那么你应该多考虑其它的方式,而不要用SOAP。
为了更好的理解SOAP,HTTP,XML如何工作的,不妨先考虑一下COM/DCOM的运行机制,DCOM处理网络协议的低层次的细节问题,如PROXY/STUB间的通讯,生命周期的管理,对象的标识。
在客户端与服务器端进行交互的时候,DCOM采用NDR(NetworkDataRepresentation)作为数据表示,它是低层次的与平台无关的数据表现形式。
DCOM是有效的,灵活的,但也是很复杂的。
而SOAP的一个主要优点就在于它的简单性,SOAP使用HTTP作为网络通讯协议,接受和传送数据参数时采用XML作为数据格式,从而代替了DCOM中的NDR格式,SOAP和DCOM执行过程是类似的,如下图,但是用XML取代NDR作为编码表现形式,提供了更高层次上的抽象,与平台和环境无关。
客户端发送请求时,不管客户端是什么平台的,首先把请求转换成XML格式,SOAP网关可自动执行这个转换。
为了保证传送时参数,方法名,返回值的唯一性,SOAP协议使用了一个私有标记表,从而服务端的SOAP网关可以正确的解析,这有点类似于COM/DCOM中的桩(STUB)。
转化成XML格式后,SOAP终端名(远程调用方法名)及其他的一些协议标识信息被封装成HTTP请求,然后发送给服务器。
如果应用程序要求,服务器返回一个HTTP应答信息给客户端。
与通常对HTML页面的HTTPGET请求不同的是,此请求设置了一些HTTPHEADER,标识着一个SOAP服务激发,和HTTP包一起传送。
例如:
对于一个询问股票价格的应用程序,服务器端具有组件提供某股票当前的价格,组件是COM或CORBA在服务器上建立的。
客户端发送一个SOAP请求给服务器询问股票价格。
服务器依赖于服务器上的SOAP网关,使用内嵌的HTML对象调用合适的方法,然后把得到的价格通过SOAP应答传给客户端。
三、java的soap服务器Axis
Axis的简介
Axis全称ApacheeXtensibleInteractionSystem,是apache组织下的一个开源项目,用来做webservice开发的,有java版的实现,也有c++版的实现,其前身最早是IBM的SOAP4J,后来捐给Apache后改名ApacheSOAP,也就是支持SOAP1.1的那个版本,到现在的AXIS已经是第三代了,AXIS对ApacheSOAP的改进有很多,比如用SAX代替以前的DOM,增加对WSDL的支持,支持SOAP1.2等等
Axis的安装
使用axis很容易,在apache网站上把axis下载了后(最新版本,把%AXIS_HOME%\webapps\axis整个目录copy到tomcat的webapps目录下面,启动tomcat,浏览器中输入
上面说的只是axis运行起来了,要想布置自己的webservice,axis支持两种方法:
一种是用JWS(JavaWebService),好处是只要有源码比如说Hello.java,把他改成Hello.jws后放到%TOMCAT_HOME%\webapps\axis目录下面就搞定,浏览器里面输入,不足的地方是能配置的地方有限(比如说Hello.java里面的所有public非static方法都会暴露),很多东西没办法弄;第二种方法就是使用wsdd(webservicedeploydescription),这个就是在TOMCAT_HOME%\webapps\axis\WEB-INF目录下写一个deploy.wsdd和undeploy.wsdd文件,然后通过javadeploy.wsdd就搞定了,卸载这个webservice就用undeploy.wsdd,客户端输入
Axis的简单访问
介绍了部署webservice的两种方法后,下面说说客户端的访问方式,也有两种,一种是通过axis实现的java里面的JAX-RPC进行动态调用,另外一种就是通过服务器端产生的wsdl文件利用WSDL2Java工具生成ClientStub后访问。
通过JAX-RPC的比较简单,需要提供的有SOAProuterURL,servicenamespace,operationname,operationparametertypes,operationreturntypes,看看下面这个例子就明白了:
publicSOAPWrapper(){ Stringlocation=""; try{ Serviceservice=newService(); call=(Call)service.createCall(); call.setTargetEndpointAddress(newurl(/location)); }catch(Throwablet){ handleError("SOAPWrapper(constructor)hadanException.",t); } }
publicvoidcreate(Bookbook){ try{ call.removeAllParameters(); call.setOperationName("create"); call.addParameter("arg1",qn,ParameterMode.IN); call.setReturnType(XMLType.AXIS_VOID); call.invoke(newObject[]{book}); return; }catch(Throwablet){ handleError("SOAPWrapper(create)hadanException.",t); return; } }
程序中的Call和Service是对JAX-RPC中Call和Service的具体实现:
implements,implements
第二种客户端的方法就是利用WSDL2Java产生Clientstub后通过stub调用,WSDL2Java的操作对象是service所对应的wsdl文件,这个文件怎么产生呢?
一种方法前面是由axis自动产生,如前面服务器端的配置所说,无论通过jws或是wsdd的方式,axis都会产生相应的wsdl;还有一种方式就是利用Java2WSDL对java源文件进行操作也可以产生相应的wsdl文件。
四、先锋学院信息管理系统实现
系统要求
1.操作系统要求:
Windows2000/2003/me/xp
2.内存:
256M以上
3.环境:
安装delphi7.0或其它版本、3.1.x
模块一、一卡通
一卡通是采用delphi和java联合开发的,delphi是客户端应用程序,而java是服务器端实现数据访问。
当能Axis在其中起到了桥梁的作用。
以下是delphi连接到Axis的源码:
unitcardAdminjws;
interface
usesInvokeRegistry,SOAPHTTPClient,Types,XSBuiltIns,IniFiles,
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,jpeg,ExtCtrls;
type
cardAdmin=interface(IInvokable)
['{B45ADEA8-B84D-636C-7F6C-F70AAD646725}']
functionsubMit(constmsg:
WideString):
WideString;stdcall;
end;
functionGetcardAdmin(UseWSDL:
Boolean=System.False;Addr:
string='';HTTPRIO:
THTTPRIO=nil):
cardAdmin;
implementation
functionGetcardAdmin(UseWSDL:
Boolean;Addr:
string;HTTPRIO:
THTTPRIO):
cardAdmin;
var
defWSDL:
String;
defURL:
String;
const
defSvc='aheadcardService';
defPrt='aheadcard';
var
RIO:
THTTPRIO;
begin
defWSDL:
=;
defURL:
='';
Result:
=nil;
if(Addr='')then
begin
ifUseWSDLthen
Addr:
=defWSDL
else
Addr:
=defURL;
end;
ifHTTPRIO=nilthen
RIO:
=THTTPRIO.Create(nil)
else
RIO:
=HTTPRIO;
try
Result:
=(RIOascardAdmin);
ifUseWSDLthen
begin
RIO.WSDLLocation:
=Addr;
RIO.Service:
=defSvc;
RIO.Port:
=defPrt;
endelse
RIO.URL:
=Addr;
finally
if(Result=nil)and(HTTPRIO=nil)then
RIO.Free;
end;
end;
initialization
InvRegistry.RegisterInterface(TypeInfo(cardAdmin),','UTF-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(cardAdmin),'');
end.
以下是jws的代码
importcard.login.*;
importcard.tools.*;
importcard.log.*;
/**
*先锋软件职业技术学院(一卡通--综合管理)
*@Author万兵
×@Versionv1.0
*/
publicclasscardAdmin{
publicStringsubMit(Stringmsg){
"========连接到cardAdminjws===========");
String[]msgArr=msg.split("#");
saveOrUpdatesave=newsaveOrUpdate();
if((msgArr.length+"").equals(msgArr[0])){
Stringcommand_id=msgArr[1];
/**
*连接测试操作
**/
if(command_id.equals("000000")){
return"2#008000";
}
/**
*登录操作
**/
if(command_id.equals("100001")){
if(!
msgArr[0].equals("5")){
return"cw00002";
}
dbOperatedb=newdbOperate("","");
String_msg=db.formatArrToString(readProperties.readPropertie("userinfo.100001"),
common.getArrMsg(msgArr));
if(_msg.startsWith("null#")){
return"3#108001#no";
}
return"3#108001#"+_msg;
}
}
}
消息文档(只含连接测试可登录操作)
消息定义
消息划分为消息头(header)和消息体(body)
1、消息头格式:
字段名
类型
长度
描述
Msg_length
Int
Unsigend
消息的长度
Command_id
String
6
消息编号(操作标志)
2、消息体
连接测试(000000)
无消息体
商户登录(010001)
字段名
类型
长度
描述
Username
String
Unsigend
用户名
Passwd
String
Unsigend
密码
Sort
integer
1
用户类型
登录回复(3#018001#)3#018001#no
字段名
类型
长度
描述
Store_id
String
Unsigend
商户号
我对以上代码不作详细分解,其方法大部分是由本人提供,下面我对消息的机制着个介绍:
每条消息分为消息头+消息体。
消息头:
Msg_length:
消息的总长度Msg_length=消息头长度
(2)+消息体长度
Command_id:
消息定义的标识符
消息体:
详见上面的商户登录(010001)
下面是一卡通的登录界面:
以下是登录的delphi交易代码
msg:
='5#010001#'+E_username.Text+'#'+E_passwd.Text+'#'+'00001#';
str:
=login.subMit(msg);
Str是回复给发消息人的信息,其中也包含了消息头和消息体,根据上面的文档要是登录成功则返回消息头跟Store_id,登录失败就返回消息头带NO。
下面简单介绍下delphi连接Axis的方法
第一步:
第二步:
第三步:
第四步:
以上便完成了delphi连接Axis的整个过程,是不是非常的简单呢?
相信通过上面的介绍您已经对我们的系统有所了解,或是对Axis有所认知呢?
结束语:
Axis的非常强大,但本系统只是就其中的一个功能进行讲诉,Axis还能与jsp/servlet进行整合,能够加快web的开发。
还有就是Axis在跨语言的时候只能支持最基本的数据类型,比如说int,Stirng,char等我们期待apache组织能够发布些能够针对某种语言的补丁包让我们能充分体验到Axis给我们带来的便利。
参考文献:
/2004/09/15/11835.html(AXIS简单实现入门)
[XML-Schema1]W3CCandidateRecommendation,"XMLSchemaPart1:
Structures,"24October2000. [XML-Schema2]W3CCandidateRecommendation,"XMLSchemaPart2:
Datatypes,"24October2000. [XML-Signature]W3CCandidateRecommendation,"XML-SignatureSyntaxandProcessing,"31October2000. BuildingSecureWebServiceswithMicrosoftSOAPToolkit2.0:
微软公司关于SOAP安全的策略。
关于SOAP安全的几篇文章:
SOAPcouldslipuponsecurity;WhySOAPdoesn'tlacksecuritywhileitdoes.;SOAPsecurityextensions:
digitalsignature;
浅谈SOAP:
对SOAP的简单介绍
仅供个人用于学习、研究;不得用于商业用途。
Forpersonaluseonlyinstudyandresearch;notforcommercialuse.
NurfürdenpersönlichenfürStudien,Forschung,zukommerziellenZweckenverwendetwerden.
Pourl'étudeetlarechercheuniquementàdesfinspersonnelles;pasàdesfinscommerciales.
толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях.
以下无正文