我正在开发一个IBM MobileFirst Platform 7.1.0应用程序,该应用程序使用受gicar / siteminder保护的多个Web服务。
根据一些教程中的建议,我创建了一个名为GicarManagementAdapter的适配器和一些其他适配器,每个Web服务都使用一个。
GicarManagementAdapter包含再次登录gicar / siteminder的逻辑。它实现了3种方法:
在submitAuthentication方法中,我通过httpClient库请求受gicar保护的资源(其中一个Web服务的wsdl文件)。 http请求为授权标头提供客户端提供的凭据。如果httr请求成功,则响应包含存储在当前客户端会话中的cookie GICSESSION:
WL.Server.getClientRequest().getSession().setAttribute("GICAR-COOKIE", cookieValue);
每当客户端应用程序想要访问后端时,它就会调用其中一个适配器方法。这些方法只构建SOAP主体并创建传递给GicarManagementAdapter.invokeService
方法的invocationData。 invokeService方法只接受调用数据并添加存储在当前客户端会话中的cookie头:
function invokeService(invocationData) {
var gicarCookie = WL.Server.getClientRequest().getSession().getAttribute("GICAR-COOKIE");
WL.Logger.info("Invoking service with coookie: " + gicarCookie);
var headers = invocationData.headers || {};
headers['cookie'] = gicarMgmt.cookieName + "=" + gicarCookie;
invocationData.headers = headers;
WL.Server.invokeHttp(invocationData);}
(为了使用Session Expired cookie处理响应,代码有点复杂)
不幸的是我无法控制后端。
我见过几个问题:
客户端应用程序的目标平台之一是桌面浏览器。如果我在Google Chrome中打开指向桌面应用版本的3个标签,我可以看到GicarManagementAdapter如何通过httpclient记录3次并获得3个不同的Cookie。但是,每次有一个应用程序向后端查询数据时,都会使用最后一个cookie。我的意思是,无论每个chrome选项卡(会话?)执行查询,WL.Server.getClientRequest()。getSession()。getAttribute(“GICAR-COOKIE”);总是得到相同的cookie。这是否意味着他们都在分享同一个会话?
似乎WL.Server.invokeHttp忽略了提供的cookie标头。一段时间不活动(3分钟)后cookie过期。在cookie到期后的第一次调用中,我可以看到响应包含值为GICSESSION = LOGGEDOFF的Set-Cookie头。下一次调用会生成一个没有任何cookie信息的重定向表单。
也许我错了,但似乎WL.Server.invokeHttp忽略了cookie标头并使用了缓存的cookie。如果我关闭所有标签,再次打开并再次登录,我得到相同的结果:没有cookie标题的重定向表单。如果我重新部署某个适配器或重新启动worklight服务器,我只会再次登录。
2016年4月10日编辑
我可以检查MFP服务器和后端之间的流量。 GicarmanagementAdapter配置为忽略cookie(我在适配器的xml设置文件的连接部分添加了<cookiePolicy>IGNORE_COOKIES</cookiePolicy>
标记)。我可以看到cookie被正确发送到后端。当cookie过期并且后端发送Set-Cookie:GICSESSION = LOGGEDOFF标头时,问题就开始了。 MFP服务器从WL.Server.InvokeHttp请求收到此标头后,会将此cookie添加到下一个请求中。所以流程如下:
似乎Worklight不尊重IGNORE_COOKIES设置。
我需要一种方法来强制WL.Server http客户端在从后端收到Set-Cookie: GICSESSION = LOGGEDOFF
后清除/删除Cookie。