Webservice EASLogin登录接口说明及安全模式

栏目:eas cloud知识作者:金蝶来源:金蝶云社区发布:2024-09-22浏览:2

Webservice EASLogin登录接口说明及安全模式

 新手入门建议先看这篇文章:EAS Cloud WebService开发最佳实践

安全模式

安全模式是EAS-WebService开发特有的概念,即webservice实际调用业务接口的时候需要传递用户会话信息(SessionId)验证登陆权限之后,才可以调用业务逻辑。

问题表现

当不使用安全模式调用WebService接口,会出现以下异常问题:

1)     程序报错:com.kingdee.bos.webservice.WSInvokeException ; com.kingdee.bos.orm.rmi.RMIException

2)     程序报错,会话异常,让重新登录:please login first

3)     程序报错,会话找不到:session not found

4)     数据异常,串用户

问题原因

出现上述异常的原因是:

1)     在使用 单独的EAS实例端口 调用 的时候,未在接口报文中传递登录接口所返回的用户会话(SessionId)

2)     在使用 EAS集群端口 调用 的时候,未在接口报文中传递登录接口所返回的用户会话(SessionId)以及登录接口所返回的cookie


正确的EAS-WebService调用图解(即使用安全模式)如下:

1)     单独的EAS实例端口 调用

 

2)     使用 EAS集群端口 调用

 

解决方案

请确认调用方用的端口是 eas的具体实例端口 还是 群集端口,两种端口修改方案如下

  实例端口调用

    注意:85版本以后实例端口不能是实例1

  • 启用安全模式

1.    修改eas\Server\eas\server\profiles\server*\config\webservice.propeties文件,另起一行,添加参数如下:(注意参数名和值不要写错)

2.  isRomoteLocate=false

3.    重启服务

  • java调用

配置文件修改后webservice调用端需要把登录返回的SessionId传过去,java调用示例如下

EASLoginProxy  proxy =null;
WSContext context = null;
//登录
proxy = new  EASLoginProxyServiceLocator().getEASLogin();
context= proxy.login("kdjgf", "",  "eas", "zs70sp5", "l2", 1);
if(context. getSessionId() == null ){throw new Exception(“login fail”);}

//具体业务调用
String[][] vouchers= null;
WSGLWebServiceFacadeSrvProxy proxyWS= null;
proxyWS = new  WSGLWebServiceFacadeSrvProxyServiceLocator().getWSGLWebServiceFacade();

//在soap-xml的header中设置登录返回的SessionId。Key是 "http://login.webservice.bos.kingdee.com"是固定的
((Stub) proxyWS).setHeader("http://login.webservice.bos.kingdee.com","SessionId", context.getSessionId()); 

vouchers = proxyWS.getVoucher("001", "2008", "5", 0, 0);

        其本质是,每次webservice访问的报文xml,必须带上登录接口返回的SessionId 信息,如下<soapenv:Header>部分。系统将根据 <soapenv:Header>的SessionId 信息,获取相关的上下文信息。

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.app.message.base.eas.kingdee.com">

  <soapenv:Header>
        <ns1:SessionId xmlns:ns1="http://login.webservice.bos.kingdee.com">
      2be84d9e-ed91-4fa5-a8e5-f39440e41ed2
        </ns1:SessionId>
  </soapenv:Header>

   <soapenv:Body>
      <web:getBillUrl soapen>
         <assignId xsi:type="xsd:string"></assignId>
         <procinstId xsi:type="xsd:string"></procinstId>
      </web:getBillUrl>
   </soapenv:Body>

</soapenv:Envelope>


 集群端口调用

  • 启用安全模式

1.    修改eas\Server\eas\server\profiles\server*\config\webservice.propetties文件,另起一行,添加参数如下:(注意参数名和值不要写错)

2.  isRomoteLocate=false

server/deploy/eas.ear/web.war/WEB-INF/server-config.wsdd文件中添加全局参数,保证服务端返回设置的cookie:

<parameter name="scope" value="session"/>

        


  •  java调用

相对实例端口调用的java代码,额外增加如下 关键代码:

//获取登录之后的cookie,然后再对业务请求设置cookie
loginStub._getCall().getMessageContext().getProperty(HTTPConstants.HEADER_COOKIE);
proxyWSStub._setProperty(HTTPConstants.HEADER_COOKIE, (String[])cookie);

//保证请求的时候会携带cookie
loginStub.setMaintainSession(true);
proxyWSStub.setMaintainSession(true);
完整样例:

import org.apache.axis.client.Stub;
import org.apache.axis.transport.http.HTTPConstants;

EASLoginProxy  loginProxy =null;
WSContext context = null;
//登录
loginProxy = new  EASLoginProxyServiceLocator().getEASLogin();

Stub loginStub = (Stub) loginProxy;
loginStub.setMaintainSession(true);        

context= loginProxy.login("kdjgf", "",  "eas", "zs70sp5", "l2", 1);
if(context. getSessionId() == null ){throw new Exception(“login fail”);}

//具体业务调用代码
String[][] vouchers= null;

WSGLWebServiceFacadeSrvProxy proxyWS= null;
proxyWS = new  WSGLWebServiceFacadeSrvProxyServiceLocator().getWSGLWebServiceFacade();

//在soap-xml的header中设置登录返回的SessionId。Key是 "http://login.webservice.bos.kingdee.com"是固定的
Stub proxyWSStub = (Stub) proxyWS;
proxyWSStub.setHeader("http://login.webservice.bos.kingdee.com","SessionId",
context.getSessionId());

//获取登录接口返回的cookie,并设置在业务请求报文中。注意仅在集群端口下才需要获取以及传递
Object cookie = loginStub._getCall().getMessageContext().getProperty(HTTPConstants.HEADER_COOKIE);
if(cookie instanceof String[]){
proxyWSStub.setMaintainSession(true);              
proxyWSStub._setProperty(HTTPConstants.HEADER_COOKIE, (String[])cookie);
}
               
//实际调用webservice接口                   
vouchers = proxyWS.getVoucher("001", "2008", "5", 0, 0);

 

  •   soapui集群端口样例 

  • 集群端口下需要设置登录接口返回的cookie,确保登录接口和业务接口请求的是同一实例。参数内容建议直接从登录接口复制到业务接口,避免错误。     

  • (图片可能存在被压缩,WebService附件中附上了原图)

               

详见附件中登录接口说明文档。调用样例详见附件“Webservice附件”。

三.    接口参数说明

  • 入参说明

1.       userName    用户名 ,
2.       password     密码 ,
3.       slnName     默认填eas,
4.       dcName      数据中心代码,管理控制台可查看
5.       language     语言 (l1,l2,l3),
6.       dbType        数据库类型(MS SQL Server:0,DB2 UDB:1,Oracle:2,MS SQL Server:3),
7.       authPattern        验证方式 默认 "BaseDB" ; 其他认证方式KEY可从
easAuthPatterns.xml中获取 ,如BaseAD
8.       isEncodePwd        密码是否加密方式传递,0未加密,1加密
  • 出参说明

WSContext.getSessionId() 返回为空则登录失败,详细信息请查看apusic日志,
不在WSContext里返回是处于安全原因。

四.    https

    详见附件:EAS登录接口说明文档(WebService).docx 。

五.    常见问题

    1. RMIException为服务器开启了安全模式,但调用方未处理好。根据上面的说明调整调用方即可。

    2. 不要把业务发布生成的class文件部署到web.war class里,统一打包当成二开jar包部署就行。

    3. 固定的登录用户不要调用logout接口,loginByLtpaToken不停的切换不同用户的话,就需要调用登出接口,否则服务器会因为登录用户一直积累导致宕机。

    4. 验证安全模式配置  isRomoteLocate=false 是否生效:客户端查询分析器执行服务端脚本》com.kingdee.bos.webservice.WSConfig.getRomoteLocate() 》返回false代表成功

    5. C#调用参考(仅供参考)

        donet/C#调用方式,部署私包sp_SOAPHead_forDoNet_V15.jar 路径:server/lib/sp

    调用样例详见附件EAS登录接口说明文档(WebService).docx 和“Webservice附件”

    6. 报错:(301)Moved Permanently

        原因是,在webservice的调用代码里使用的是http://xxxx, 而EAS的网络代理 即集群端口设置了要使用https,做       了重定向导致的。解决方案:把调用代码改成https://xxxxx

六.    临时过渡方案

    由于一旦启用安全模式,所有调用方都得照规则携带sessionid和cookie,此方式为安全模式和非安全模式并存,只能作为临时过渡方案,尽量不要使用,详见“Webservice附件”。




EAS登录接口说明文档(WebService).docx

WebService附件.zip

Webservice EASLogin登录接口说明及安全模式

新手入门建议先看这篇文章:EAS Cloud WebService开发最佳实践安全模式安全模式是EAS-WebService开发特有的概念,即webservice实际调用...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息