renxiao2003 发表于 2011-12-21 08:44

Axis2 Web Services 中使用session的配置及使用方法

<DIV>
<DIV class=cnt id=blog_text>
<P>在这里我将使用一个简单的Web Service 示例的方式演示一下在Axis2 Web Service 中使<BR>用session 的方法。在这个Service 具有登录和取得已登录用户的用户名两个功能。<BR>此示例中所使用的工具:<BR>1.eclipse3.1。<BR>2.Axis2(Apache Axis2 SNAPSHOT build (July 30, 2006) Standard Binary Release)<BR>3.Microsoft Visual C# 2005 Express Edition<BR>4.apache-tomcat-5.5.15(注意:Axis2 必须使用Tomcat5.5)<BR>5.<BR><STRONG>1.</STRONG>在eclipse中新建一个java工程Axis2SessionDemo(如下图),开始编写wsdl文件<BR>UserServices.wsdl(内容如下)。<BR>Axis2SessionDemo 工程结构<BR>UserServices.wsdl<BR>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&lt;wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"<BR>xmlns:tns="http://sysguard.livedoor.cn/UserServices/"<BR>xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"<BR>xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="UserServices"<BR>targetNamespace="http://sysguard.livedoor.cn/UserServices/"&gt;<BR>&lt;wsdl:types&gt;<BR>&lt;xsd:schema<BR>targetNamespace="http://sysguard.livedoor.cn/UserServices/"&gt;<BR>&lt;xsd:element name="loginRequest"&gt;<BR>&lt;xsd:complexType&gt;<BR>&lt;xsd:sequence&gt;<BR>&lt;xsd:element name="userID" type="xsd:string"&gt;<BR>&lt;/xsd:element&gt;<BR>&lt;xsd:element name="password"<BR>type="xsd:string"&gt;<BR>&lt;/xsd:element&gt;<BR>&lt;/xsd:sequence&gt;<BR>&lt;/xsd:complexType&gt;<BR>&lt;/xsd:element&gt;<BR>&lt;xsd:element name="loginResponse"&gt;<BR>&lt;xsd:complexType&gt;<BR>UserServices.wsdl<BR>&lt;xsd:sequence&gt;<BR>&lt;xsd:element name="return" type="xsd:string"&gt;<BR>&lt;/xsd:element&gt;<BR>&lt;/xsd:sequence&gt;<BR>&lt;/xsd:complexType&gt;<BR>&lt;/xsd:element&gt;<BR>&lt;xsd:element name="getUsernameResponse"&gt;<BR>&lt;xsd:complexType&gt;<BR>&lt;xsd:sequence&gt;<BR>&lt;xsd:element name="return" type="xsd:string"&gt;<BR>&lt;/xsd:element&gt;<BR>&lt;/xsd:sequence&gt;<BR>&lt;/xsd:complexType&gt;<BR>&lt;/xsd:element&gt;<BR>&lt;xsd:element name="getUsernameRequest"&gt;<BR>&lt;xsd:complexType&gt;<BR>&lt;xsd:sequence&gt;<BR>&lt;xsd:element name="userID" type="xsd:string"&gt;<BR>&lt;/xsd:element&gt;<BR>&lt;/xsd:sequence&gt;<BR>&lt;/xsd:complexType&gt;<BR>&lt;/xsd:element&gt;<BR>&lt;/xsd:schema&gt;<BR>&lt;/wsdl:types&gt;<BR>&lt;wsdl:message name="loginResponse"&gt;<BR>&lt;wsdl:part name="loginResponse" element="tns:loginResponse"&gt;&lt;/wsdl:part&gt;<BR>&lt;/wsdl:message&gt;<BR>&lt;wsdl:message name="loginRequest"&gt;<BR>&lt;wsdl:part name="loginRequest" element="tns:loginRequest"&gt;&lt;/wsdl:part&gt;<BR>&lt;/wsdl:message&gt;<BR>&lt;wsdl:message name="getUsernameResponse"&gt;<BR>&lt;wsdl:part name="getUsernameResponse"<BR>element="tns:getUsernameResponse"&gt;<BR>&lt;/wsdl:part&gt;<BR>&lt;/wsdl:message&gt;<BR>&lt;wsdl:message name="getUsernameRequest"&gt;<BR>&lt;wsdl:part name="getUsernameRequest"<BR>element="tns:getUsernameRequest"&gt;<BR>&lt;/wsdl:part&gt;<BR>&lt;/wsdl:message&gt;<BR>&lt;wsdl:portType name="UserServices"&gt;<BR>&lt;wsdl:operation name="login"&gt;<BR>&lt;wsdl:input message="tns:loginRequest"&gt;&lt;/wsdl:input&gt;<BR>&lt;wsdl:output message="tns:loginResponse"&gt;&lt;/wsdl:output&gt;<BR>&lt;/wsdl:operation&gt;<BR>&lt;wsdl:operation name="getUsername"&gt;<BR><BR><STRONG>2.</STRONG>使用Axis2 的WSDL2java.bat工具和UserServices.wsdl文件生成Web Service 的服务器端<BR>的Java代码。生成之后的结构如下图:<BR>生成代码的命令如下(没有换行)<BR>D:\tools\axis2-std-SNAPSHOT-bin\bin\WSDL2java.bat -ss -sd -p cn.livedoor.sysguard -o<BR>D:\java_projects\workspace\Axis2SessionDemo -uri<BR>D:\java_projects\workspace\Axis2SessionDemo\UserServices.wsdl<BR>生成服务器端代码之后工程结构<BR><STRONG>3.</STRONG>修改resources\services.xml 文件,配置Service 提供Session的功能。<BR>在services.xml文件中找到如下左边内容,并将此内容替换为如下右边内容。<BR>&lt;service name="UserServices"&gt; &lt;service name="UserServices" scope="soapsession"&gt;<BR><STRONG>4.</STRONG>新建一个cn.livedoor.sysguard.Constants.java类,用来保存在session 中保存数据的标识。内<BR>容如下:</P>
<P><BR>cn.livedoor.sysguard.Constants.java<BR>package cn.livedoor.sysguard;<BR>public class Constants {<BR><BR>//在session 中存放用户ID的标识<BR>public static final String USER_ID = "userid";<BR><BR>//在session 中存放密码的标识<BR>public static final String USER_PASSWORD = "password";<BR>}</P>
<P><BR><STRONG>5.</STRONG>在cn.livedoor.sysguard.UserServicesSkeleton.java类中编写业务逻辑方法。需增加业务内容<BR>的方法:login, getUsername。增加的其它方法:setOperationContext。内容如下:<BR>cn.livedoor.sysguard.UserServicesSkeleton.java<BR>/**<BR>* UserServicesSkeleton.java<BR>*<BR>* This file was auto-generated from WSDL<BR>* by the Apache Axis2 version: SNAPSHOT Jul 30, 2006 (08:21:11 GMT+00:00)<BR>*/<BR>package cn.livedoor.sysguard;<BR>import org.apache.axis2.AxisFault;<BR>import org.apache.axis2.context.MessageContext;<BR>import org.apache.axis2.context.OperationContext;<BR>import org.apache.axis2.context.SessionContext;<BR>import org.apache.axis2.wsdl.WSDLConstants;<BR>import cn.livedoor.sysguard.userservices.GetUsernameResponse;<BR>import cn.livedoor.sysguard.userservices.LoginResponse;<BR>/**<BR>* UserServicesSkeleton java skeleton for the axisService<BR>*/<BR>public class UserServicesSkeleton {<BR>SessionContext sessionCnt = null;<BR>/**<BR>* 在每次业务方法调用之前都先调用此方法。 在此方法中用来获得sessionContext。<BR>*<BR>* @param operationContext<BR>* @throws AxisFault<BR>*/<BR>public void setOperationContext(OperationContext operationContext)<BR>throws AxisFault {<BR>System.out.println("+++++++++++ setOperationContext start +++++++++++");<BR>MessageContext msgCnt = operationContext<BR>.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);<BR>this.sessionCnt = msgCnt.getSessionContext();<BR>System.out.println("+++++++++++ setOperationContext end +++++++++++");<BR>}<BR>cn.livedoor.sysguard.UserServicesSkeleton.java<BR>/**<BR>* 业务方法 在此例中用来将客户端传送过来的数据保存至sessionContext 中。<BR>*<BR>* Auto generated method signature<BR>*<BR>* @param param0<BR>*<BR>*/<BR>public cn.livedoor.sysguard.userservices.LoginResponse login(<BR>cn.livedoor.sysguard.userservices.LoginRequest param0)<BR>throws AxisFault<BR>{<BR>System.out.println("+++++++++++ login start +++++++++++");<BR>String ret = "";<BR>LoginResponse res = new LoginResponse();<BR>String userID = param0.getUserID();<BR>String password = param0.getPassword();<BR>setProperty(Constants.USER_ID, userID);<BR>setProperty(Constants.USER_PASSWORD, password);<BR>ret += "userID: " + userID + " password: " + password + "\n";<BR>System.out.println(ret);<BR>res.set_return(ret);<BR>System.out.println("+++++++++++ login success end +++++++++++");<BR>return res;<BR>}<BR>/**<BR>* 业务方法 在此例中用来将保存至sessionContext 中的数据取出并返回给客户端。<BR>*<BR>* Auto generated method signature<BR>*<BR>* @param param2<BR>*<BR>*/<BR>public cn.livedoor.sysguard.userservices.GetUsernameResponse getUsername(<BR>cn.livedoor.sysguard.userservices.GetUsernameRequest param2)<BR>{<BR>System.out.println("+++++++++++ getUserName start +++++++++++");<BR>String ret = "";<BR>GetUsernameResponse res = new GetUsernameResponse();<BR>cn.livedoor.sysguard.UserServicesSkeleton.java<BR>String param2_userid = "param2.getUserID(): " + param2.getUserID()<BR>+ "\n";<BR>String userID = getProperty(Constants.USER_ID);<BR>String password = getProperty(Constants.USER_PASSWORD);<BR>ret += param2_userid + " userID: " + userID + " password: " + password;<BR>res.set_return(ret);<BR>System.out.println(ret);<BR>System.out.println("+++++++++++ getUserName success end +++++++++++");<BR>return res;<BR>}<BR>/**<BR>* 私有方法 用来将数据保存至sessionContext 中。<BR>*<BR>* @param name<BR>* @param value<BR>* @throws AxisFault<BR>*/<BR>private void setProperty(String name, String value) throws AxisFault {<BR>System.out.println("setProperty name: " + name + " value: " + value);<BR>sessionCnt.setProperty(name, value);<BR>}<BR>/**<BR>* 私有方法 用来将保存至sessionContext 中的数据取出。<BR>*<BR>* @param name<BR>* @return<BR>*/<BR>private String getProperty(String name) {<BR>String value = (String) sessionCnt.getProperty(name);<BR>String result = "getProperty name: " + name + " value: " + value;<BR>System.out.println(result);<BR>return value;<BR>}<BR>}<BR>6.到此为至服务器端Java代码已全部完成。现在将此工程打包为一个.aar 包。<BR>1.在eclipse中打开ant视图,并将WSDL2Java生成的build.xml加入。<BR>2.运行build.xml 中的jar.server 任务生成UserServices.aar 包。<BR>3.运行2 中的命令之后将会新生成一个build 目录,生成包的位置在工程中:<BR>build\lib\UserServices.aar。<BR>运行jar.server任务之后的工程结构<BR>7.现在配置Axis2,使Axis2 打开支持Session 的功能。找到axis2.war 在Tomcat中解开之后<BR>的位置,例如:C:\apache-tomcat-5.5.15\webapps\axis2(以下就将此目录简称为axis2 Web应<BR>用目录)。然后在此目录(axis2 Web 应用目录)中的WEB-INF\conf 目录下有一个名为<BR>axis2.xml的文件,打开此文件,并将如下图中左边内容替换为右边内容。<BR>Axis2.xml<BR>&lt;parameter name="manageTransportSession"<BR>locked="false"&gt;false&lt;/parameter&gt;<BR>&lt;parameter name="manageTransportSession"<BR>locked="false"&gt;true&lt;/parameter&gt;<BR>8.将步骤6 中生成的UserServices.aar 包复制至axis2 Web 应用目录中的WEB-INF\services<BR>中,启动Tomcat。<BR>这样整个Web Services的服务器端都已经配置完毕,接下来编写C#客户端的代码。<BR>在客户端A<BR>1.新建一个ConsoleApplication 工程Axis2SessionClientDemo。<BR>2.在”References”上面点击右键,选择”Add Web References”。<BR>3.输入”Http://localhost:8080/axis2/services/UserServices?wsdl”,设置该引用的名称为<BR>“UserServices”。增加引用完成。<BR>4.打开Program.cs 增加如下代码:<BR>Program.cs<BR>using System;<BR>using System.Collections.Generic;<BR>using System.Text;<BR>using System.Net;<BR>namespace ConsoleApplication1<BR>{<BR>class Program<BR>{<BR>static void Main(string[] args)<BR>{<BR>Program.cs<BR>UserServices.UserServices service = new ConsoleApplication1.UserServices.UserServices();<BR>CookieContainer cookieContainer = new CookieContainer();<BR>service.CookieContainer = cookieContainer;<BR>UserServices.loginRequest loginReq = new ConsoleApplication1.UserServices.loginRequest();<BR>loginReq.userID = "whxy";<BR>loginReq.password = "whxy_password";<BR>UserServices.loginResponse loginRes = service.login(loginReq);<BR>UserServices.UserServices service1 = new ConsoleApplication1.UserServices.UserServices();<BR>//CookieContainer cookieContainer1 = new CookieContainer();<BR>service1.CookieContainer = service.CookieContainer;<BR>UserServices.getUsernameRequest req = new ConsoleApplication1.UserServices.getUsernameRequest();<BR>req.userID = "00001";<BR>UserServices.getUsernameResponse res = service1.getUsername(req);<BR>UserServices.getUsernameResponse res1 = service1.getUsername(req);<BR>UserServices.getUsernameResponse res2 = service1.getUsername(req);<BR>UserServices.getUsernameResponse res3 = service1.getUsername(req);<BR>UserServices.getUsernameResponse res4 = service1.getUsername(req);<BR>UserServices.getUsernameResponse res5 = service1.getUsername(req);<BR>System.Console.WriteLine(res.@return);<BR>}<BR>}<BR>}<BR>5.在客户端B 做跟客户端A 同样的内容,并且将传递给服务器端的数据修改为<BR>loginReq.userID = "tister";<BR>loginReq.password = "tister_password";<BR>req.userID = "999999";<BR>6.在调试状态下,将客户端A 的程序运行至<BR>UserServices.getUsernameResponse res1 = service1.getUsername(req);<BR>查看res的返回结果。<BR>7.在调试状态下,将客户端B 的程序也运行至<BR>UserServices.getUsernameResponse res1 = service1.getUsername(req);<BR>查看res的返回结果。<BR>8.再将客户端A 的程序运行至<BR>UserServices.getUsernameResponse res2 = service1.getUsername(req);<BR>查看res1 的返回结果。<BR>9.对比第6 步中客户端A 的res与第8 步中客户端A的res1 的返回结果,这两次的返回结果<BR>是一样的,期望的也是一样的,因为这两次方法调用都是从同一个客户端访问的。再对比第<BR>7 步中客户端B 的res与第8 步中客户端A 的res1 的返回结果,这两次的返回结果将是不一<BR>样的,期望的结果是不一样,因为此时客户端A 已经成功登录,并且将数据保存在服务器<BR>端的session 中了,而后客户端B 也登录至服务器,并将数据保存在服务器端的session 中<BR>了,不同的客户端之间保存的数据是相互独立的,相互之间并没有什么影响,所以达到了最<BR>终的目的。<BR>10.注意:在第一次服务调用时一定要先创建CookieContainer,并且在以后的每次服务调用<BR>都要将第一次返回的CookieContainer 发送至服务器端,以标识该请求是同一客户端的请<BR>求。<BR>UserServices.UserServices service = new ConsoleApplication1.UserServices.UserServices();<BR>CookieContainer cookieContainer = new CookieContainer();<BR>service.CookieContainer = cookieContainer;<BR>UserServices.UserServices service1 = new ConsoleApplication1.UserServices.UserServices();<BR>service1.CookieContainer = service.CookieContainer;<BR>《完》</P></DIV><BR></DIV>
页: [1]
查看完整版本: Axis2 Web Services 中使用session的配置及使用方法