以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 Web Services & Semantic Web Services 』  (http://bbs.xml.org.cn/list.asp?boardid=10)
----  请高手进啊!关于AXIS中SESSION的管理问题。  (http://bbs.xml.org.cn/dispbbs.asp?boardid=10&rootid=&id=32617)


--  作者:phoenixfmc
--  发布时间:5/18/2006 3:55:00 PM

--  请高手进啊!关于AXIS中SESSION的管理问题。
我是一名AXIS的初学者。最近在作一个练习的时候碰到了一个问题。我想在一个用户登陆验证后把这个用户的用户名存在服务器端的SESSION里,然后在客户端每次再调用SERVICE之前都判断一下,以此来限制权限。可是现在的问题是:第一次存在SESSION里的值在第二次访时得不到了。在看了CSDN上的那篇写SESSION的文章之后,我也在客户端和服务器端的配置文件中用AXIS自带的工具加入了一个Handler,在本机中的IE里也看到了返回的SOAP消息的Header中也自动地加入了SESSIONID的内容,可是第二次的ID值和第一次的ID值不一致,也是得不是第一次SESSION中存的那个值。现在将我的代码片断贴示如下:
SERVICE:package fmc;

import java.sql.ResultSet;
import java.sql.SQLException;
import javax.xml.soap.SOAPException;
import org.apache.axis.session.Session;
import org.apache.axis.MessageContext;
public class ServiceTest {
 public boolean login(String username, String password) throws Exception {
  MessageContext mc = MessageContext.getCurrentContext();
  Session conSession = mc.getSession();
  mc.setMaintainSession(true);
  String sql = "select * from aa022 where aav001='" + sername
    + "' and aaw001='" + password + "'";
  ResultSet result = OraJDBCTest.executeQuery(sql);
  if (result.next()) {
   conSession.set("username", username);
   conSession.set("password", password);
   OraJDBCTest.close();
   return true;
  } else {
   return false;
  }
 }

 public boolean changeadminpwd(String oldpwd, String newpwd)
 throws SQLException, ClassNotFoundException, SOAPException {
  MessageContext mc = MessageContext.getCurrentContext();
  Session conSession = mc.getSession();
  mc.setMaintainSession(true);
  String password = (String) conSession.get("password");
  String name = (String) conSession.get("username");
  String sql = "select * from aa022 where aaw001='" + oldpwd
    + "' and aab002='" + name + "'";
  ResultSet rs = OraJDBCTest.getRs(sql);
  if (rs.next()) {
  String sqlupdate = "update aa022 set aaw001='" + newpwd
+ "' where aab002='" + name + "' and aaw001='" + oldpwd + "'";
   OraJDBCTest.executeUpdate(sqlupdate);
   OraJDBCTest.close();
   return true;
  } else {
   return false;
  }
 }

CLIENT:
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import org.apache.axis.client.Service;
import org.apache.axis.client.Call;
import client.ServiceTestServiceLocator;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

public class TestClient {
 Service service = new Service();
 ServiceTestServiceLocator locator = new ServiceTestServiceLocator();
 public void loginTest(String username,String password) {
  try {
   locator.setMaintainSession(true);
   /*ServiceTest_PortType st = locator.getServiceTest();
   if(st.login(username, password)){
    System.out.println("Ke Yi Deng Lu ! ");
   }
   else{
    System.out.println("CUO WU ! QING CHONG SHI !");
   }*/
   Call call = (Call) service.createCall();
   // call.setProperty(Call.SESSION_MAINTAIN_PROPERTY,Boolean.TRUE);
   //call.setProperty(Call.USERNAME_PROPERTY,username);
      //call.setProperty(Call.PASSWORD_PROPERTY,password);
   // call.setMaintainSession(true);
   //call.setUsername(username);
   //call.setPassword(password);
   String endpoint = "http://192.168.0.22:8899/MyService/services/Sessions?wsdl";
   call.setOperationName(new QName(endpoint, "login"));
   call.setTargetEndpointAddress(new java.net.URL(endpoint));
   //call.addParameter("fmc",org.apache.axis.Constants.XSD_STRING,javax.xml.rpc.ParameterMode.IN);
   //call.setReturnType(org.apache.axis.Constants.XSD_STRING);
   Object[] params = { username, password };
   String obj = (String)call.invoke(params);
   System.out.println(obj);
   if (obj.equals("true")) {
    System.out.println("Ke Yi Deng Lu ! " + obj + " !");
   }
   else if(obj.equals("false")){
    System.out.println("CUO WU ! QING CHONG SHI !");
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public void changeTest(String oldpwd, String newpwd)
   throws ServiceException, MalformedURLException, RemoteException {
  locator.setMaintainSession(true);
  /*ServiceTest_PortType st = locator.getServiceTest();
  if(st.changeadminpwd(oldpwd, newpwd)){
   System.out.println("Xiu Gai Cheng Gong ! ");
  }
  else{
   System.out.println("CUO WU ! CHONG SHI !");
  }*/
  Call call = (Call) service.createCall();
  //call.setMaintainSession(true);
  String endpoint = "http://192.168.0.22:8899/MyService/services/Sessions?wsdl";
  call.setOperationName(new QName(endpoint, "changeadminpwd"));
  call.setTargetEndpointAddress(new java.net.URL(endpoint));
  // call.addParameter("fmc",org.apache.axis.Constants.XSD_STRING,javax.xml.rpc.ParameterMode.IN);
  // call.setReturnType(org.apache.axis.Constants.XSD_STRING);
  Object[] params = { oldpwd, newpwd };
  String obj = (String) call.invoke(params);
  // System.setProperty("org.xml.sax.driver",
  // "org.apache.xerces.parsers.SAXParser");
  System.out.println(obj);
  if (obj.equals("true")) {
   System.out.println("XIU GAI CHENG GONG ! " + obj + " !");
  }
  if (obj.equals("false")) {
   System.out.println("CUO WU ! QING CHONG SHI !");
  }
 }

 public static void main(String[] args) throws MalformedURLException,
   RemoteException, ServiceException {
  TestClient tc = new TestClient();
  tc.loginTest("admin", "phoenix");
  tc.changeTest("phoenix", "admin");
 }
}

两个配置文件:
1、server-config.xml
<?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>
  <parameter name="sendMultiRefs" value="true"/>
  <parameter name="disablePrettyXML" value="true"/>
  <parameter name="adminPassword" value="admin"/>
  <parameter name="attachments.Directory" value="D:\java\tomcat50-jwsdp\webapps\axis\WEB-INF\attachments"/>
  <parameter name="dotNetSoapEncFix" value="true"/>
  <parameter name="enableNamespacePrefixOptimization" value="false"/>
  <parameter name="sendXMLDeclaration" value="true"/>
  <parameter name="sendXsiTypes" value="true"/>
  <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
  <requestFlow>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="Session"/>
   </handler>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="Session"/>
    <parameter name="extension" value=".jwr"/>
   </handler>
  </requestFlow>
</globalConfiguration>
<handler name="session" type="java:org.apache.axis.handlers.SimpleSessionHandler"/>
<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
<service name="AdminService" provider="java:MSG">
  <parameter name="allowedMethods" value="AdminService"/>
  <parameter name="enableRemoteAdmin" value="false"/>
  <parameter name="className" value="org.apache.axis.utils.Admin"/>
  <namespace>http://xml.apache.org/axis/wsdd/</namespace>
  <namespace>http://xml.apache.org/axis/wsdd/</namespace>
</service>
<service name="Version" provider="java:RPC">
  <parameter name="allowedMethods" value="getVersion"/>
  <parameter name="className" value="org.apache.axis.Version"/>
</service>
<service name="Sessions" provider="java:RPC" style="wrapped" use="literal">
  <requestFlow>
   <handler type="session"/>
  </requestFlow>
  <responseFlow>
   <handler type="session"/>
  </responseFlow>
  <parameter name="allowedMethods" value="*"/>
  <parameter name="className" value="fmc.ServiceTest"/>
  <namespace>urn:fmc:Sessions</namespace>
</service>
<service name="ServiceTest" provider="java:RPC">
  <parameter name="allowedMethods" value="*"/>
  <parameter name="className" value="fmc.ServiceTest"/>
</service>
<transport name="http">
  <requestFlow>
   <handler type="URLMapper"/>
   <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
  </requestFlow>
  <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
  <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
  <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>
  <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>
  <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
  <parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
</transport>
<transport name="local">
  <responseFlow>
   <handler type="LocalResponder"/>
  </responseFlow>
</transport>
</deployment>
2、client-config.xml
<?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>
<parameter name="adminPassword" value="admin"/>
<parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
<parameter name="sendMultiRefs" value="true"/>
<parameter name="sendXsiTypes" value="true"/>
<parameter name="sendXMLDeclaration" value="true"/>
<parameter name="axis.sendMinimizedElements" value="true"/>
<requestFlow>
<handler type="java:org.apache.axis.handlers.SimpleSessionHandler"/>
</requestFlow>
<responseFlow>
<handler type="java:org.apache.axis.handlers.SimpleSessionHandler"/>
</responseFlow>
</globalConfiguration>
<handler name="session" type="java:org.apache.axis.handlers.SimpleSessionHandler"/>
<service name="Sessions" provider="java:RPC" style="wrapped" use="literal">
<requestFlow>
<handler type="session"/>
</requestFlow>
<responseFlow>
<handler type="session"/>
</responseFlow>
<parameter name="allowedMethods" value="*"/>
<parameter name="className" value="fmc.ServiceTest"/>
<namespace>urn:fmc:Sessions</namespace>
</service>
<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>
我用的开发工具是:
Eclipse JBossIDE 3.1
Tomcat 5.0.28 和 tomcat50-jwsdp
AXIS1.3  
JDK1.5 和 jwsdp-1.4
请各位高手帮忙啊!!!!!小弟感激不尽啊!!!
我每天都会到这个论坛来看看的。谢谢各位高手了!!!!!!!


--  作者:octavian
--  发布时间:6/23/2006 10:25:00 PM

--  
[B]server-config.wsdd :
<service name="Sessions".......>
  <requestFlow>
   <handler type="session">
在这里是不是要接收session id的值(SimpleSessionHandler的某个属性)?? 比如:
   <parameter name="sessionId" value="org.apache.axis.handler.SimpleSessionHandler.SESSION ID" >
   </handler>
  </requestFlow>
.........
</service>
--  作者:phoenixfmc
--  发布时间:6/26/2006 1:26:00 PM

--  
这个方法试了,不过还是没有解决问题。还是老样子。大家能不能再想想办法了?要是以后用这个东东,一定会碰到这个问题的。如果那位已经解决了这个问题,就请赐教吧,除了得分之外,我还会感恩带德的。谢谢啦!
--  作者:phoenixfmc
--  发布时间:7/6/2006 12:48:00 PM

--  
没人再来研究这个问题了吗?头痛啊!!!来个高手帮帮我吧!
--  作者:octavian
--  发布时间:7/6/2006 6:34:00 PM

--  
你为什么在客户端(TestClient)不写setMaintainSession呢?
我看了Axis的FAQ,在Server端用MessageContext.setMaintainSession()
在client端,用org.apache.axis.client.Service.setMaintainSession()

--  作者:phoenixfmc
--  发布时间:7/7/2006 9:03:00 AM

--  
写了,能不写吗?都试过的。可是写也没用啊,还是找不到啊。所以才着急呢!!!对了,要是客户端用delphi作是不是能简单一点呢?不知道delphi对这个问题有没有什么好的解决办法。请高手指点一下。
谢谢!!!
--  作者:xpf7622
--  发布时间:9/18/2006 9:51:00 AM

--  
在服务端根本不用调用什么setMaintance,这说明你没有看明白网上:Manage session in Axis那篇文章.
客户端:

SimpleSessionHandler sesshandler = new SimpleSessionHandler();
        
        //调用SendDatainfo服务
        Call call = (Call) service.createCall();
        call.setClientHandlers(sesshandler, sesshandler);
试试这个,我的就是用这个成功的.


--  作者:phoenixfmc
--  发布时间:9/25/2006 1:22:00 PM

--  
谢谢二位了。我会按照二位说的都试试。可我在用delphi作的客户端调用时,服务器端的SESSION竟然能存住值了。呵呵,我也没改什么代码。真是有点意思。这些天真的很忙,呵呵,才看到回复。不好意思。下面结贴了,给分。呵呵。再次表示感谢!
--  作者:kevin_78
--  发布时间:3/14/2007 1:22:00 PM

--  
来个高手帮帮
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
138.672ms