丢失两个页面之间的会话变量

时间:2019-06-28 04:23:56

标签: coldfusion session-variables application.cfm

这很奇怪。我最近将站点移到了CF11上的共享主机上(我相信),所以我不知道这是否与此有关。以前没有发生过。

我仍在使用application.cfm(不是cfc),目前看起来像这样:

var base64Auth = Convert.ToBase64String(Encoding.Default.GetBytes
($"{functionCredentials.Properties.PublishingUserName}:{functionCredentials.Properties.PublishingPassword}"));
var stream = new MemoryStream(File.ReadAllBytes("zip file of azure function"));
using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add("Authorization", "Basic " + base64Auth);
    var apiUrl = "https://" + parameters.FunctionAppName + ".scm.azurewebsites.net/api/zip/site/wwwroot";
    var httpContent = new StreamContent(stream);
    client.PutAsync(apiUrl, httpContent).Result;

}

我们的网站catholicity.co.nz允许用户添加公司列表。列出过程分步骤进行,首先选择一个类别,然后输入更多详细信息。我们将列表数据存储在名为“ session.post”的会话变量中。选择类别后,jQuery代码将所选类别传递给Coldfusion cfc函数,该函数创建session.post并将所选类别添加到其中(<CFAPPLICATION NAME="catholicity" SESSIONMANAGEMENT="Yes" SESSIONTIMEOUT=#CreateTimeSpan(0,2,0,0)# CLIENTMANAGEMENT="Yes" CLIENTSTORAGE="Cookie" > )。然后,jQuery将加载一个新页面以输入更多详细信息。我已经确认jQuery可以读取cfc中创建的会话范围。在第二页上,会话范围似乎正在丢失。当我在新页面顶部转储会话范围时,Session.post不会出现。

javascript重定向代码如下:

session.post.category

直接从cfc中读取cat和subcat值,该cfc返回session.post

top.location.href="/post/post.cfm?cat=" + cat + "&subcat=" + subcat + "&mode=" + mode;

奇怪的是,如果用户在创建新公司列表时已登录,则不会发生此问题。我不确定为什么,因为登录会创建一个名为<cffunction.....> ... <cfset session.post.category = nCategoryId & "^" & sCategory> <cfset session.post.subcategory = arguments.id & "^" & sSubcategory> <cfset session.post.prev="subcategory_id"> <cfset session.post.next="details"> ... <cfreturn session.post> </cffunction> 的单独的会话变量,据我所知session.usersession.user之间没有任何连接。

该问题可以在http://www.catholicity.co.nz进行测试,然后单击顶部的“添加业务”。我已经在第一页和第二页上丢弃了会话和客户端作用域,并在来自初始cfc调用的回调中显示了JS警报。

编辑

我的application.cfm如下:

session.post

我试图注释掉潜在的易混淆的代码部分,但无济于事。

1 个答案:

答案 0 :(得分:3)

我对您的Application.cfm页面进行了测试。就像我在上面的评论中所说的那样,您的会话将针对每个请求重新启动。 (我的意思是您的CFID和CFToken值对于每个请求都会更改)。

我经历了您的代码流。在这里,您将使用会话值重置CFID和CFToken Cookie。

<cfif structKeyExists(session,"cfid")>
    <cfcookie name="cfid" value="#session.cfid#" expires="NOW">
    <cfcookie name="cftoken" value="#session.cftoken#" expires="NOW">
</cfif>

在每个请求上,将执行Application.cfm页面。那时,以上条件structKeyExists(session,"cfid")对于每个请求都返回true。因此,每个请求都运行<cfcookie>代码。您已将cookie设置为“立即过期”,这意味着它们会立即过期。这样您的会议就可以算是新的了。这是您的应用程序中的问题。

根据the docs

  

当用户关闭浏览器时,该cookie失效,即该cookie是“仅会话”。

因此,请检查您的上述条件。我不确定为什么您要立即终止该Cookie。也许您的业务逻辑就是这样,但是代码逻辑是不正确的。

因此,请根据您的业务需求更改此逻辑。请删除该代码并重新启动您的应用程序,然后您将为每个请求仅获得一个CFID和CFToken,直到会话过期。

下面的图像我已经运行了应用程序以设置CFCookie值。对于每个请求,它被认为是不同的CFID和CFToken值。您可以在下面看到CFID不同,例如2106、2107、2108

enter image description here

如果我删除带有Cookie值的条件,则该条件仅被视为一个会话。 CFID保持2109,直到会话终止。

enter image description here

因此,请更正您的状况和CFCookie功能。这就是问题的原因。