2015-10-07 62 views
1

我使用凭据调用认证服务,并使用认证信息响应返回的cookie。我需要这些信息来访问Web服务。WSO2 ESB使用多个cookie从传输标题获取cookie

问题是,身份验证服务返回多个cookie的响应,但我只能访问第一个cookie响应它是我需要访问Web服务的第二个cookie(WSL-external = VhTee1 ...) 。

我从认证服务器得到响应:

HTTP/1.1 200 OK 
Content-Language: en-US 
Expires: Thu, 01 Jan 1970 00:00:00 GMT 
Set-Cookie: JSESSIONID=000036_xxxxxxx_xxxxxx_xxxxxx:xxxxxxxxx; Path=/ 
Set-Cookie: WSL-external=VhTee1YVaxsBANcABHVzZXJpZD11d2lzaABpcGFkZHI9Ny43LjcuNwBhY2lncm91cD1SSVAAZGVwdD02NzIwAG9yZ2NvZGU9PwBlbXBjb2RlPUEAbXJyb2xlPU4Ab3JnPVBBRwBjb21wYW55PT8AZGl2YWJicj1HRwBzaXRlY29kZT03MDAzAGNpdHk9Y2l0eQBzdGF0ZT0/AGNvdW50cnk9R0cAc3ViamVjdGlkPXV3aXNoQGdnLmNvbQAAAENOPXdzbC1leHRlcm5hbABqdXN0aW5jYXNlaWZ0aGlzY29pbnRhaW5zc29tZXNlbnRpdml0ZWRhdGFpbW5vdGdpdmluZ2l0dG95b3U=; Path=/; Domain=.xxx.xxx 
Content-Type: text/html; charset=UTF-8; charset=UTF-8 
Pragma: no-cache 
Cache-Control: no-cache 
Date: Wed, 07 Oct 2015 08:58:36 GMT 
Transfer-Encoding: chunked 
Connection: Keep-Alive 

的ESB序列:

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="TestLogProxy" 
     transports="https,http" 
     statistics="disable" 
     trace="disable" 
     startOnLoad="true"> 
    <target> 
     <inSequence> 
     <property name="uri.var.userid" value="userid"/> 
     <property name="uri.var.password" value="password"/> 
     <send> 
      <endpoint> 
       <http method="GET" 
        uri-template="https://www.company.biz/auth.cgi?userid={uri.var.userid}&amp;password={uri.var.password}"/> 
      </endpoint> 
     </send> 
     </inSequence> 
     <outSequence> 
     <property name="setCookieHeader" 
        expression="$trp:Set-Cookie" 
        scope="default" 
        type="STRING"/> 
     <log level="custom"> 
      <property name="setCookieHeader value" expression="$ctx:setCookieHeader"/> 
     </log> 
     <send/> 
     </outSequence> 
    </target> 
    <description/> 
</proxy> 

我得到的日志消息:

setCookieHeader value = JSESSIONID=000036_xxxxxxx_xxxxxx_xxxxxx:xxxxxxxxx; Path=/ 

我有也试图让我自己的班调解员:

package org.wso2.mediator; 

import java.util.Map; 

import org.apache.synapse.MessageContext; 
import org.apache.synapse.core.axis2.Axis2MessageContext; 
import org.apache.synapse.mediators.AbstractMediator; 

public class CookieMediator extends AbstractMediator { 

    public boolean mediate(MessageContext synCtx) { 
     try { 
      System.out.println("CookieMediator doing stuff..."); 

      // Extracting transport headers 
      org.apache.axis2.context.MessageContext msgContext = ((Axis2MessageContext) synCtx).getAxis2MessageContext(); 

      Map headersMap = (Map) msgContext.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS); 

      // Printing the cookie 
      System.out.println("Cookie: " + headersMap.get("Set-Cookie")); 

      } catch (Exception e) { 
      System.out.println("Exception: " + e); 
      handleException("Exception", e, synCtx); 
      } 

     return true; 
    } 
} 

而且从序列像这样调用它:

<class name="org.wso2.mediator.CookieMediator"/> 

但它也只返回第一个Cookie:

Cookie: JSESSIONID=000036_xxxxxxx_xxxxxx_xxxxxx:xxxxxxxxx; Path=/ 

我已经看过这些帖子,但它不会与帮助我有第二个饼干问题:

In WSO2 ESB, how to store cookies and use them later for authentication?

WSO2 ESB - How to get and set cookies in WSDL calls in

谢谢。

UPDATE:

我下面的解决方案:

package org.wso2.mediator; 

import java.util.Map; 
import org.apache.synapse.MessageContext; 
import org.apache.synapse.core.axis2.Axis2MessageContext; 
import org.apache.synapse.mediators.AbstractMediator; 

public class CookieMediator extends AbstractMediator { 

    public boolean mediate(MessageContext synCtx) { 
     try { 
      System.out.println("CookieMediator extracting cookie..."); 

      // Extracting cookie from excess headers 
      org.apache.axis2.context.MessageContext msgContext = ((Axis2MessageContext) synCtx).getAxis2MessageContext(); 
      Map excessHeaders = (Map) msgContext.getProperty("EXCESS_TRANSPORT_HEADERS"); 

      if (excessHeaders != null) { 
       String cookie = excessHeaders.get("Set-Cookie").toString().split(";")[0]; 

       if (cookie.startsWith("[WSL-external")) { 
        System.out.println("Cookie: " + cookie.substring(1)); 
       } 
      } 
      } catch (Exception e) { 
      System.out.println("Exception: " + e); 
      handleException("Exception", e, synCtx); 
      } 

     return true; 
    } 
} 

回答

1

您可能需要从EXCESS_TRANSPORT_HEADERS地图得到这个。

Map excessHeaders = (Map) synCtx.getProperty(NhttpConstants.EXCESS_TRANSPORT_HEADERS); 

更具体地说,这是一个包含多值标头的MultiValueMap

+0

谢谢拉杰夫!这解决了这个问题,我能够从标题中提取第二个cookie。 –