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

Coldfusion 在两个页面之间丢失会话变量,coldfusion,session-variables,application.cfm,Coldfusion,Session Variables,Application.cfm,这是一个奇怪的。我最近把这个网站移到了CF11上的共享主机上(我相信),所以我不知道这是否与此有关。这以前没有发生过 我仍然在使用application.cfm(不是cfc),它目前看起来是这样的: <CFAPPLICATION NAME="catholicity" SESSIONMANAGEMENT="Yes" SESSIONTIMEOUT=#CreateTimeSpan(0,2,0,0)# CLIENTMANAGEMENT="Yes" CLIE

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

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

<CFAPPLICATION 
    NAME="catholicity"
    SESSIONMANAGEMENT="Yes"
    SESSIONTIMEOUT=#CreateTimeSpan(0,2,0,0)#
    CLIENTMANAGEMENT="Yes"
    CLIENTSTORAGE="Cookie"
>
top.location.href="/post/post.cfm?cat=" + cat + "&subcat=" + subcat + "&mode=" + mode;
<CFAPPLICATION 
    NAME="catholicity"
    SESSIONMANAGEMENT="Yes"
    SESSIONTIMEOUT=#CreateTimeSpan(0,2,0,0)#
    CLIENTMANAGEMENT="Yes"
    CLIENTSTORAGE="Cookie"
>

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

<cfif structKeyExists(url, "logout")>
    <cfset session.user.authenticated = 0>
</cfif>

<cfparam name="session.cfid" default="">
<cfparam name="session.cftoken" default="">

<cfparam name="session.mode" default="temp">

<cfparam name="session.user.authenticated" default="0">
<cfparam name="session.user.confirmed" default="0">
<cfparam name="session.user.disabled" default="0">
<cfparam name="session.user.id" default="">
<cfparam name="session.user.email" default="">
<cfparam name="session.user.contact_name" default="">

<cferror type="exception" template="/error.cfm">

<cfscript>
    application.accepted_docs = "application/pdf,application/msword,application/vnd.ms-excel,text/plain,vnd.ms-word.document.12,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    application.accepted_images = "image/jpg,image/gif,image/jpeg,image/png,image/x-png,image/pjpeg ";
    application.accepted_videos = "video/x-flv,video/mp4,video/x-msvideo,video/x-ms-asf,video/x-ms-wmv,audio/x-ms-wma";
....
</cfscript>

<cflock name="#APPLICATION.applicationName#" 
        type="Exclusive" 
        timeout="20" 
        throwontimeout="Yes"> 

    <cfparam name="APPLICATION.SessionTracker" default=#StructNew()#> 

    <cfscript>
        sUserInfo = StructNew();
        sUserInfo.Address="#CGI.REMOTE_ADDR#";
        sUserInfo.CFID="#session.cfid#";
        sUserInfo.Token="#session.cftoken#";
        sUserInfo.Address="#CGI.REMOTE_ADDR#";
        sUserInfo.Time="#Now()#";
        sUserInfo.Template="#CGI.CF_Template_Path#";
        ID = "#session.cfid##session.cftoken#";
    </cfscript>

   <CFSET dummy = StructInsert(APPLICATION.SessionTracker, ID, sUserInfo, true)> 
</cflock>
cat和SUBACT值直接从返回session.post的cfc读取

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

我已经试着注释掉了一些可能不可靠的代码部分,但没有用。

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

我检查了你的代码流。在这里,您将使用会话值重置CFID和CFToken cookies

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

每次请求时,都会执行Application.cfm页面。此时,上述条件
structKeyExists(会话,“cfid”)
为每个请求返回true。因此,每个请求都运行
代码。您已将Cookie设置为“立即”过期,这意味着它们将立即过期。因此,您的会话将被视为新会话。这就是应用程序中的问题

依照

当用户关闭浏览器时,cookie过期,即cookie为“仅会话”

因此,请检查您的上述情况。我不知道你为什么要马上让饼干过期。也许您的业务逻辑是这样的,但是代码逻辑是不正确的

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

下图是我运行应用程序设置CFCookie值的过程。它被认为是每个请求的不同CFID和CFToken值。您可以在下面看到CFID是不同的,如210621072108

如果我删除具有cookie值的条件,它将被视为只有一个会话。CFID保持为2109,直到会话到期


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

为什么您的CFID和CFToken为空?在您的RESTNSE标题中,我可以多次看到set cookie CFID和CFTOKEN,列表中的最后一个设置为空@user460114,您的会话转储似乎有cfID和CFToken键的空值。您必须检查三件事:1)检查应用程序,为每个请求重新启动。2)检查会话在应用程序中的清除位置。否则,请在此提供整个application.cfm文件。这里是关于会话相关代码的。3) 检查应用程序根目录中是否有application.cfc文件。因为cf11首先命中application.cfc。如果您的根目录中有application.cfc,那么请检查该文件,在该文件中您的会话将被清除。返回session.post值的函数的返回类型是什么?如果函数返回类型为void,则表示它不会返回任何内容。因此,session.variable将不再显示。@SathishChelladurai函数返回是否无效并不重要。会话启动后,CFID&CFToken应具有值。确保函数和cfID值之间没有关系。该函数只有user、post、next和prv。我会检查附近是否有另一个
application.cfm
application.cfc
谢谢Kannan,但这不是问题所在。我认为代码可能会导致问题,所以实际上我已经尝试删除application.cfm中的所有内容,除了基本内容。什么都没用。只有当用户登录时,它才能正常工作。如果用户未登录,有时它会工作,但大多数情况下不会。我得弄清楚原因。没有@user460114。你可以看到我上面的屏幕截图。我用你的代码做了一些示例应用。把那块饼干拿开就行了。你是否更改了你的申请名称?或者在删除该代码后重新启动cfm服务?如果没有,请尝试一下。并尝试在测试模式下使用专用浏览器。更新我的进一步澄清。但是我在本地解决了这个问题。是的,你是对的。问题在于缓存。彻底清除缓存后,一切又恢复正常。非常感谢。