ColdFusion 未在 cfhttp 调用中维护 session

ColdFusion not maintaining session across cfhttp calls

我在尝试使用 cfhttp 时遇到问题。我使用的 API 要求我发送登录凭据,然后发送后续命令。后续命令的回复是"login required"。在查看了我的请求后,我想我已经找到了问题所在,但我不明白。

这是我的登录电话:

<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> 

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

<cfset ThisCookie = LoginAttempt.responseHeader["Set-Cookie"] />

然后,进行下一个调用:

<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> 

我认为的问题是这样的;当我查看第二个 cfhttp 调用的 header 时,它与第一个调用提供的 cookie 不匹配。我不确定为什么会这样。在 Ben Nadel 的博客页面 here 上,他有一个函数可以将返回的 cookie 拆分为一个结构并将其传递给第二个调用。我已经尝试过相同的结果。我错过了什么吗?

您不能从响应中获取 Set-Cookie header 并在请求中将其作为 Cookie header 回显。 Set-Cookie can contain directives like Domain, Path, Secure, HttpOnly, Expires, Max-Age etc. You need to strip them and reduce it to the cookie's key-value pair, because that's what the Cookie header 在您的请求中应该包含。

示例 1,单个 cookie

回复:

Set-Header: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; Path=/; HttpOnly

Key-Value-Pair:

Key: JSESSIONID
Val: 9335968036E8B5EE9F9D00032A5A665D

要求:

Cookie: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D

示例 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

Key-Value-Pairs:

Key: JSESSIONID
Val: 9335968036E8B5EE9F9D00032A5A665D

Key: uid
Val: d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436

要求:

Cookie: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; uid=d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436

对于初学者来说,像这样天真的东西:

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

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

在研究同样的问题时,我遇到了 CFHTTPSession.cfc by Ben Nadel 为您处理 cookie 的问题。