7
回答
关于Axis的一个问题,麻烦大家帮我看看。
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

大家好,我最近在做一个小应用,实现一个单点登录。
我的思路是这样的。
有两个应用A和B,都基于struts2,B集成了Axis,并发布了登录服务,当A登录的时候顺便访问B提供的登录服务,这样来完成一方输入多方登录的功能。
A在访问B的服务时,提供服务的方法(login),我用了MessageContext来获取HttpServletRequest,以此来设置Session
具体如下:
MessageContext context = MessageContext.getCurrentContext();
HttpServletRequest req = (HttpServletRequest)context.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);
req.getSession().setAttribute("userName", userName);
好了,我以为这样设置完Session之后,当我访问B系统的Action时就可以取得Sesson存的值,具体如下。
userName=(String)ServletActionContext.getRequest().getSession().getAttribute("userName");
但是令我失望的是得到的值为null。
 
我的问题出在什么地方呢,我觉得可能是两个Seeeion不一样,或者说不是一类的,谢谢大家帮我看一下。

举报
冬-冬
发帖于7年前 7回/2K+阅
共有7个答案 最后回答: 7年前

好久没用axis了,帮你找一个文章,看看有没有参考价值:

第 7 章 在axis中使用session

axis中有两种方法实现session,一种是依靠HTTP和HTTP cookies,另一种是用SOAP headers。

7.1. 依靠cookie

服务器端SessionService.java

package anni.session;
import org.apache.axis.MessageContext;
import org.apache.axis.session.Session;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class SessionService {
Log log = LogFactory.getLog(SessionService.class);
public String echo(String in) {
MessageContext mc = MessageContext.getCurrentContext();
Session session = mc.getSession();
log.info("session : " + session);
String name = (String)session.get("name");
session.set("name", name + " - input : " + in);
log.info(in + " - name : [" + name + "]");
return in;
}
}

deploy_8.wsdd

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="SessionService" provider="java:RPC">
<parameter name="className" value="anni.session.SessionService"/>
<parameter name="allowedMethods" value="echo"/>
<parameter name="scope" value="session"/>
</service>
</deployment>

我遇到的问题就在于一直没有给service定义scope,而且她还是大小写敏感的。现在我把这个service的scope定义为session就可以传递session了。

使用deploy_8.wsdd重新发布SessionService服务

java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/ deploy_8.wsdd

axis会在响应信息中添加对cookie的操作

Set-Cookie: JSESSIONID=49EBBB19A1B2F8D10EE075F6F14CB8C9; Path=/axis

客户端SessionClient.java

package anni.session;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class SessionClient {
public static void main(String [] args) throws Exception {
Log log = LogFactory.getLog(SessionClient.class);
String endpoint = "http://localhost:8080/axis/services/SessionService";
Service service = new Service();
service.setMaintainSession(true);//设置为保持会话

Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName("echo");
String res = (String) call.invoke(new Object[]{"lingo"});
System.out.println(res);

call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName("echo");
res = (String) call.invoke(new Object[]{"sophia"});
System.out.println(res);

call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName("echo");
res = (String) call.invoke(new Object[]{"swallow"});
System.out.println(res);
}
}

client会在请求中添加cookie的信息

Cookie: JSESSIONID=49EBBB19A1B2F8D10EE075F6F14CB8C9

重复调用三次,检验session是否生效。

7.2. 使用SOAP headers

在wsdd中添加SimpleSessionHandler的定义,新的deploy_9.wsdd

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<handler name="session" type="java:org.apache.axis.handlers.SimpleSessionHandler"/>
<service name="SessionService" provider="java:RPC">
<requestFlow>
<handler type="session"/>
</requestFlow>
<responseFlow>
<handler type="session"/>
</responseFlow>
<parameter name="className" value="anni.session.SessionService"/>
<parameter name="allowedMethods" value="echo"/>
<parameter name="scope" value="session"/>
</service>
</deployment>

使用deploy_9.wsdd重新发布SessionService服务

java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/ deploy_9.wsdd

创建client-config.wsdd

java %AXISCLASSPATH% org.apache.axis.utils.Admin client deploy_9.wsdd

不知道为什么,我自己生成的client-config.wsdd总是不能正常使用,没法子,只好自己手动修改

deploy_9.wsdd

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<requestFlow>
<handler type="java:org.apache.axis.handlers.SimpleSessionHandler"/>
</requestFlow>
<responseFlow>
<handler type="java:org.apache.axis.handlers.SimpleSessionHandler"/>
</responseFlow>
</globalConfiguration>
<transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender"/>
<transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
<transport name="local" pivot="java:org.apache.axis.transport.local.LocalSender"/>
</deployment>

把client-config.wsdd放在classpath下,然后运行SessionClient,handler会自动在soap header中添加jsessionid的信息。

引用来自#3楼“冬-冬”的帖子

谢谢“红薯 ”,我试了一下,但是这篇文章是关于Axis自己的session的,这个session并不能代表B系统的session。郁闷中..

哪有什么Axis自己的session啊,这个session就是http的session

你的程序问题不在服务器端,应该在web服务的客户端,没有带上cookie导致的。

把你的问题再描述的详细一点。A系统,B系统分别干什么的,哪个用了Axis,你需要完成什么样的业务逻辑。

引用来自#4楼“红薯”的帖子

引用来自#3楼“冬-冬”的帖子

谢谢“红薯 ”,我试了一下,但是这篇文章是关于Axis自己的session的,这个session并不能代表B系统的session。郁闷中..

哪有什么Axis自己的session啊,这个session就是http的session

你的程序问题不在服务器端,应该在web服务的客户端,没有带上cookie导致的。

 呵呵,我觉得你是对的。浏览器在访问B时没有B的sessionId,所有就不能识别了。下面的问题是,我不知道怎么把这个sessionId通过服务传给A。

我有一个想法是,当A调用B的login服务时,B传递sessionId给,由A把这个sessionId做成cookie。可以吗?,我试试去。

引用来自#5楼“虫虫”的帖子

把你的问题再描述的详细一点。A系统,B系统分别干什么的,哪个用了Axis,你需要完成什么样的业务逻辑。

 就一很简单的登录功能,登录A的同时登录B,一个action请求A系统login,login中又访问了B系统提供的登录服务。 B系统集成了Axis,并且提供了loginService的方法,该方法中使用MessageContext生成了一个session,当又action请求B时,能够发现这个session,问题就是怎么才能发现这个session呢?

顶部