用AXIS 创建的webservice 使用session出现的问题,请高手指点,有高分相送,多谢谢了!!!

时间:2022-02-17 21:26:39
1.我写的webservice

package MyTest;
import org.apache.axis.session.Session;
import org.apache.axis.MessageContext;


public class Service1 {



/**
 * 
 */
public Service1() {
super();
// TODO 自动生成构造函数存根
}

public String  Login( String UserName, String PWD )
{
MessageContext mc = MessageContext.getCurrentContext();
Session session = mc.getSession();
if( session.get("UserName") != null )
{
if( session.get("UserName").equals(UserName) )
{
return "old " + UserName;
}
}
if( UserName.equals("jacksong") && PWD.equals("jacksong") )
{
session.set("UserName", "jacksong");
return "jacksong";
}
else if( UserName.equals("sxg") && PWD.equals("sxg"))
{
session.set("UserName", "sxg");
return "sxg";
}
else
{
return "failt;" + UserName + ";" + PWD;
}
}

public String GetUserName()
{
MessageContext mc = MessageContext.getCurrentContext();
Session session = mc.getSession();
return " Get " + (String)session.get("UserName");
}

}

2.编译了这个类 房在 axis/classes/MyTest 目录下了

3.编写了deploy.wsdd文件,执行了 java org.apache.axis.client.AdminClient deploy.wsdd 也成功了
<deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="MyService" provider="java:RPC">
<parameter name="className" value="MyTest.Service1"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="session"/>
</service>
</deployment>

4.在浏览器的地址栏的 http://localhost:8081/axis/services/MyService?wsdl也看到生成的wsdl文件了

5.我用asp.net写了一个客护端来调用这个webservice,也成功了,但是session没有起到保存用户名的做用,因为我用调用Login把UserName存入session后,再调用GetUserName时,却返回null 

这个是asp.net的代码:TextBox1是输入用户名;TextBox2是输入秘密的; TextBox3是显示调用结果的;Button1_Click 是调用 Login ;Button2_Click 是调用GetUserName的

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using WebApplication4.localhost;

namespace WebApplication4
{
/// <summary>
/// WebForm1 的摘要说明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox TextBox1;
protected System.Web.UI.WebControls.TextBox TextBox2;
protected System.Web.UI.WebControls.TextBox TextBox3;
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.Button Button2;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{    
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Button2.Click += new System.EventHandler(this.Button2_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void Button1_Click(object sender, System.EventArgs e)
{
Service1Service  ss = new Service1Service();
string rs = ss.Login(TextBox1.Text, TextBox2.Text);
TextBox3.Text = rs;
}

private void Button2_Click(object sender, System.EventArgs e)
{
Service1Service  ss = new Service1Service();
string rs = ss.GetUserName();
TextBox3.Text = rs;
}
}
}

21 个解决方案

#1


没人顶 自己先顶一下了

#2


UP

#3


可能,Service1,webservice是无状态的吧,所以不能保存

#4


但是 我在网上搜的文章说是可以的 可以有状态的啊
http://www-128.ibm.com/developerworks/cn/webservices/ws-deepaxis/index.html?ca=dwcn-newsletter-webservices

http://www.matrix.org.cn/resource/article/1592.html
都有详细的说明怎么用session的但是就是产生的效果不符合,郁闷啊,望高手指点啊。。。

#5


应该不可以吧, 即使可以可能也是靠Web容器实现. 而不是WebService的功能. 毕竟WebService是一个 Web 提交, 在web层可以使用request 对象

#6


TinyJimmy(Jimmy) 请你先看看http://www-128.ibm.com/developerworks/cn/webservices/ws-deepaxis/index.html?ca=dwcn-newsletter-webservices

http://www.matrix.org.cn/resource/article/1592.html
这两个地方说的东西,我就是按他们说的培植的 是可以保存状态的

#7


超时了吧,应该是axis有这个超时设置的

#8


文章
http://www-128.ibm.com/developerworks/cn/webservices/ws-deepaxis/index.html?ca=dwcn-newsletter-webservices
说到的Web服务会话管理也是HTTP中的, 具体没有试过. 以下是原文

"在Web服务中我们可以借助HTTP以及HTTP Cookie来处理会话信息。前面我们介绍了大多数对Axis的管理都是通过MessageContext实例来完成的。下面的例子首先验证用户的登录帐号与口令如果正确则在会话中保存用户的登录信息,并提供接口供客户端获取密码。..."

你可以查一查双方交换的数据内容, 看客户端有没有将Session传到服务器中

#9


UP 还有没方法解觉。。。

#10


你可以试一下用axis做客户端是否可以,如果可以,那就是.NET和axis合作的问题了

#11


没有高手解决啊

#12


楼主莫非想做一个“有状态”的webservice,这好像和应用webservice的理念有点不符啊。

#13


你看看你tomcat的web.xml里,<session-config>下的 <session-timeout>是多少,是不是很小,以至于很快就超时

#14


没用过.net 但你在调用时要用,但你.net客户端的调用必须加上
setMaintainSession(true); //这是JAVA的写法,只有这样才能何存Session的。

所以我想.net也应该有一个这样的设置

#15


楼主解决了吗?我也遇到这个问题,但是通过在浏览器直接敲地址session可以保存信息,如果解决的话,麻烦给我说一下.
msn:hj82103@hotmail.com

#16


pdw2009(不想做菜鸟) 正解

#17


我出现的问题是用程序访问web service时,每次访问都会产生一个新的session,包括我最后在程序中用httpclient访问jsp和servlet的测试也是一样,我用了pdw2009的方法试过,但是没成功,不知道是不是还有别的问题?

#18


学习中  定一下!?

#19


过了这么多天终于找到问题了,我以前访问是每次访问都创建一个Service对象和Call对象,这样AXIS引擎以为又开起了一个新的会话,所以在后面的session中取不到值,后来我用单例模式创建Service对象和Call对象,问题就解决了,当然问题是解决了,但我不能肯定我的观点一定正确,不过我自己是这么认为的.

#20


hj821003(java老百姓) ( ) 信誉:94  2006-03-20 19:07:00  得分: 0  
 
   过了这么多天终于找到问题了,我以前访问是每次访问都创建一个Service对象和Call对象,这样AXIS引擎以为又开起了一个新的会话,所以在后面的session中取不到值,后来我用单例模式创建Service对象和Call对象,问题就解决了,当然问题是解决了,但我不能肯定我的观点一定正确,不过我自己是这么认为的.
------------------------------------------------------------

我感觉不是这个原因,应该是你在login和getusername里都取了新的session吧?
 

#21


该回复被版主删除

#1


没人顶 自己先顶一下了

#2


UP

#3


可能,Service1,webservice是无状态的吧,所以不能保存

#4


但是 我在网上搜的文章说是可以的 可以有状态的啊
http://www-128.ibm.com/developerworks/cn/webservices/ws-deepaxis/index.html?ca=dwcn-newsletter-webservices

http://www.matrix.org.cn/resource/article/1592.html
都有详细的说明怎么用session的但是就是产生的效果不符合,郁闷啊,望高手指点啊。。。

#5


应该不可以吧, 即使可以可能也是靠Web容器实现. 而不是WebService的功能. 毕竟WebService是一个 Web 提交, 在web层可以使用request 对象

#6


TinyJimmy(Jimmy) 请你先看看http://www-128.ibm.com/developerworks/cn/webservices/ws-deepaxis/index.html?ca=dwcn-newsletter-webservices

http://www.matrix.org.cn/resource/article/1592.html
这两个地方说的东西,我就是按他们说的培植的 是可以保存状态的

#7


超时了吧,应该是axis有这个超时设置的

#8


文章
http://www-128.ibm.com/developerworks/cn/webservices/ws-deepaxis/index.html?ca=dwcn-newsletter-webservices
说到的Web服务会话管理也是HTTP中的, 具体没有试过. 以下是原文

"在Web服务中我们可以借助HTTP以及HTTP Cookie来处理会话信息。前面我们介绍了大多数对Axis的管理都是通过MessageContext实例来完成的。下面的例子首先验证用户的登录帐号与口令如果正确则在会话中保存用户的登录信息,并提供接口供客户端获取密码。..."

你可以查一查双方交换的数据内容, 看客户端有没有将Session传到服务器中

#9


UP 还有没方法解觉。。。

#10


你可以试一下用axis做客户端是否可以,如果可以,那就是.NET和axis合作的问题了

#11


没有高手解决啊

#12


楼主莫非想做一个“有状态”的webservice,这好像和应用webservice的理念有点不符啊。

#13


你看看你tomcat的web.xml里,<session-config>下的 <session-timeout>是多少,是不是很小,以至于很快就超时

#14


没用过.net 但你在调用时要用,但你.net客户端的调用必须加上
setMaintainSession(true); //这是JAVA的写法,只有这样才能何存Session的。

所以我想.net也应该有一个这样的设置

#15


楼主解决了吗?我也遇到这个问题,但是通过在浏览器直接敲地址session可以保存信息,如果解决的话,麻烦给我说一下.
msn:hj82103@hotmail.com

#16


pdw2009(不想做菜鸟) 正解

#17


我出现的问题是用程序访问web service时,每次访问都会产生一个新的session,包括我最后在程序中用httpclient访问jsp和servlet的测试也是一样,我用了pdw2009的方法试过,但是没成功,不知道是不是还有别的问题?

#18


学习中  定一下!?

#19


过了这么多天终于找到问题了,我以前访问是每次访问都创建一个Service对象和Call对象,这样AXIS引擎以为又开起了一个新的会话,所以在后面的session中取不到值,后来我用单例模式创建Service对象和Call对象,问题就解决了,当然问题是解决了,但我不能肯定我的观点一定正确,不过我自己是这么认为的.

#20


hj821003(java老百姓) ( ) 信誉:94  2006-03-20 19:07:00  得分: 0  
 
   过了这么多天终于找到问题了,我以前访问是每次访问都创建一个Service对象和Call对象,这样AXIS引擎以为又开起了一个新的会话,所以在后面的session中取不到值,后来我用单例模式创建Service对象和Call对象,问题就解决了,当然问题是解决了,但我不能肯定我的观点一定正确,不过我自己是这么认为的.
------------------------------------------------------------

我感觉不是这个原因,应该是你在login和getusername里都取了新的session吧?
 

#21


该回复被版主删除