ColdFusion无法在cfhttp调用之间维护会话

Pat*_*urg 2 coldfusion coldfusion-10

我在尝试使用时遇到问题cfhttp。我使用的API要求我发送登录凭据,然后发送后续命令。对后续命令的答复是“需要登录”。在查看了我的请求之后,我认为我已经找到了问题,但我不理解。

这是我的登录电话:

<cfhttp url="#Target#"  result="LoginAttempt"  method="POST" REDIRECT="No" useragent="#strUserAgent#"> 
    <cfhttpparam type="FORMFIELD" name="action" value="Login"  />
    <cfhttpparam name="loginUsername" value="#Username#" type="FORMFIELD" />    
    <cfhttpparam name="loginPassword" value="#Password#" type="FORMFIELD" /> 
</cfhttp> 
Run Code Online (Sandbox Code Playgroud)

当返回时200 OK,我将cookie设置为用于将来的调用:

<cfset ThisCookie = LoginAttempt.responseHeader["Set-Cookie"] />
Run Code Online (Sandbox Code Playgroud)

然后,继续下一个调用:

<cfhttp url="#Target#"  result="CreateTransactionAttempt" method="POST" REDIRECT="No" useragent="#strUserAgent#"> 
    <cfhttpparam type="header" name="Cookie" value="#ThisCookie#" />
    <cfhttpparam type="FORMFIELD" name="action" value="CreateTransaction" />
    <cfhttpparam type="FORMFIELD" name="transactionName" value="#TransactionName#" />
</cfhttp> 
Run Code Online (Sandbox Code Playgroud)

我认为的问题是 当我查看第二个cfhttp调用的标题时,它与第一个调用提供的cookie不匹配。我不确定为什么会这样。在本纳德尔的博客页面在这里,他有分裂返回的cookie到一个结构并传递到第二个呼叫的功能。我已经尝试了相同的结果。我想念什么吗?

Ale*_*lex 10

您不能Set-Cookie从响应中获取标头,而仅将其作为Cookie请求中的标头回显。设置Cookie可以包含类似的指令DomainPathSecureHttpOnlyExpiresMax-Age等你需要带他们,并减少对cookie的键值对,因为这是对的Cookie在你的请求头应该包含。

示例1,单个cookie

响应:

Set-Header: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; Path=/; HttpOnly
Run Code Online (Sandbox Code Playgroud)

键值对:

Key: JSESSIONID
Val: 9335968036E8B5EE9F9D00032A5A665D
Run Code Online (Sandbox Code Playgroud)

请求:

Cookie: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D
Run Code Online (Sandbox Code Playgroud)

示例2,多个cookie

响应:

Set-Header: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; Path=/; HttpOnly
Set-Header: uid=d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436; expires=Thu, 02-Apr-20 18:50:36 GMT; path=/; domain=.example.org; HttpOnly
Run Code Online (Sandbox Code Playgroud)

键值对:

Key: JSESSIONID
Val: 9335968036E8B5EE9F9D00032A5A665D

Key: uid
Val: d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436
Run Code Online (Sandbox Code Playgroud)

请求:

Cookie: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; uid=d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436
Run Code Online (Sandbox Code Playgroud)

对于初学者来说,有些天真,例如:

<cfset ThisCookie = getToken(LoginAttempt.responseHeader["Set-Cookie"], 1, ";") />
Run Code Online (Sandbox Code Playgroud)

可能已经为您解决了这个问题。