ColdFusion没有在cfhttp调用之间维护会话

问题描述 投票:2回答:1

我在尝试使用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> 

当这返回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呼叫的标头时,它与第一个呼叫提供的cookie不匹配。我不确定为什么会这样。在Ben Nadel的博客页面here上,他有一个函数将返回的cookie拆分为一个结构并将其传递给第二个调用。我尝试过同样的结果。我错过了什么吗?

coldfusion coldfusion-10
1个回答
10
投票

您不能从响应中获取Set-Cookie标头,并在请求中将其作为Cookie标头回显。 Set-Cookie可以包含DomainPathSecureHttpOnlyExpiresMax-Age等指令。你需要剥离它们并将其减少到cookie的键值对,因为这就是你的请求中的Cookie头应该包含的内容。

Example 1, single cookie

响应:

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

键 - 值对:

Key: JSESSIONID
Val: 9335968036E8B5EE9F9D00032A5A665D

请求:

Cookie: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D

Example 2, multiple cookies

响应:

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: JSESSIONID
Val: 9335968036E8B5EE9F9D00032A5A665D

Key: uid
Val: d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436

请求:

Cookie: JSESSIONID=9335968036E8B5EE9F9D00032A5A665D; uid=d1b68f6fe0ca70e8d53bd3a2f32d06c1f1554317436

对于初学者来说,天真就像:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.