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附件”。
Webservice EASLogin登录接口说明及安全模式
本文2024-09-22 19:53:37发表“eas cloud知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-eas-110118.html