这很奇怪。我最近将站点移到了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.user
和session.user
之间没有任何连接。
该问题可以在http://www.catholicity.co.nz进行测试,然后单击顶部的“添加业务”。我已经在第一页和第二页上丢弃了会话和客户端作用域,并在来自初始cfc调用的回调中显示了JS警报。
我的application.cfm如下:
session.post
我试图注释掉潜在的易混淆的代码部分,但无济于事。
答案 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
如果我删除带有Cookie值的条件,则该条件仅被视为一个会话。 CFID保持2109,直到会话终止。
因此,请更正您的状况和CFCookie功能。这就是问题的原因。