Session 会话超时后ColdFusion用户登录失败
我们最近搬到了cf11进行一个项目,遇到了一个不寻常的问题: 当用户让他们的会话超时,并尝试重新登录时,需要两次尝试才能成功登录 当用户手动注销时,他们登录没有问题 这个问题在CF8中没有发生。我已经检查了用户范围,看不出有什么不同。我尝试在登录之前添加注销代码,希望可以使状态保持不变。两者都不起作用。这是一个已知的问题吗?你有什么建议我可以试试吗 编辑: 我在项目的根目录中有Application.cfc和result.cfm。 我有一个未登录页面的登录/文件夹。包含处理身份验证的signin.cfm和onsignin.cfm的。 运行代码时,请等待会话超时,然后再次使用相同的用户名登录 signin/signin.cfmSession 会话超时后ColdFusion用户登录失败,session,login,coldfusion,coldfusion-11,Session,Login,Coldfusion,Coldfusion 11,我们最近搬到了cf11进行一个项目,遇到了一个不寻常的问题: 当用户让他们的会话超时,并尝试重新登录时,需要两次尝试才能成功登录 当用户手动注销时,他们登录没有问题 这个问题在CF8中没有发生。我已经检查了用户范围,看不出有什么不同。我尝试在登录之前添加注销代码,希望可以使状态保持不变。两者都不起作用。这是一个已知的问题吗?你有什么建议我可以试试吗 编辑: 我在项目的根目录中有Application.cfc和result.cfm。 我有一个未登录页面的登录/文件夹。包含处理身份验证的signin
<form action="onsignin.cfm" method="POST" >
User name: <input name="login" type="text" />
<input type="submit" value="Login" name="btnSubmit" >
</form>
<cffunction name="authenticate" access="public" returntype="void">
<cfargument name="login" />
<cflogin idletimeout="3600">
<cfloginuser name="#arguments.login#" password="1234AbCd" roles="admin,developer,login_session,login_signoff" />
</cflogin>
<cfreturn />
</cffunction>
<cfscript>
authenticate(trim(Login));
writeOutput("At /signin/onsignin.cfm<br/>");
writeOutput("IsUserLoggedIn: #IsUserLoggedIn()#<br /><hr/>");
</cfscript>
<cflocation url="../result.cfm" addToken="no" /><!--- before we get to result.cfm onRequestStart() in Application.cfc is triggered. --->
用户名:
signin/onsignin.cfm
<form action="onsignin.cfm" method="POST" >
User name: <input name="login" type="text" />
<input type="submit" value="Login" name="btnSubmit" >
</form>
<cffunction name="authenticate" access="public" returntype="void">
<cfargument name="login" />
<cflogin idletimeout="3600">
<cfloginuser name="#arguments.login#" password="1234AbCd" roles="admin,developer,login_session,login_signoff" />
</cflogin>
<cfreturn />
</cffunction>
<cfscript>
authenticate(trim(Login));
writeOutput("At /signin/onsignin.cfm<br/>");
writeOutput("IsUserLoggedIn: #IsUserLoggedIn()#<br /><hr/>");
</cfscript>
<cflocation url="../result.cfm" addToken="no" /><!--- before we get to result.cfm onRequestStart() in Application.cfc is triggered. --->
验证(trim(登录));
写输出(“At/signin/onsignin.cfm
”;
写输出(“IsUserLoggedIn:#IsUserLoggedIn()#
”;
Application.cfc
<cfcomponent>
<cfset THIS.Name = "LoginTest" />
<cfset THIS.SessionManagement = true />
<cfset THIS.ClientManagement = false />
<cfset THIS.LoginStorage = "session" />
<cfset THIS.setClientCookies = false />
<cfset This.sessiontimeout= createTimeSpan(0,0,0,20)/><!--- 20second timeout to show the session problem --->
<cffunction name="outputCurrentLoginState" access="private">
<cfargument name="currentFunction" type="string" required="true"/>
<cfargument name="TargetPage" type="string" required="true"/>
<cfscript>
writeOutput("In function: #arguments.currentFunction# state is <br />");
writeOutput("TargetPage: #arguments.TargetPage# <br />");
writeOutput("GetAuthUser: #GetAuthUser()#<br />");
writeOutput("GetUserRoles: #GetUserRoles()#<br />");
writedump(session);
writedump(cookie);
writeOutput("IsUserLoggedIn: #IsUserLoggedIn()#<br /><hr />");
/*use writeLog() to view to Console */
</cfscript>
</cffunction>
<cffunction name="OnRequestStart" access="public" returntype="boolean">
<cfargument name="TargetPage" type="string" required="true"/>
<cfset outputCurrentLoginState("OnRequestStart",arguments.TargetPage)/>
<cfif not IsDefined("Cookie.CFID")>
<CFLOCK SCOPE="SESSION" TYPE="exclusive" TIMEOUT="5">
<cfcookie name="CFID" value="#SESSION.CFID#" secure="false" httpOnly="true" />
<cfcookie name="CFTOKEN" value="#SESSION.CFTOKEN#" secure="false" httpOnly="true" />
</CFLOCK>
</cfif>
<cfreturn true />
</cffunction>
<cffunction name="OnRequest" access="public">
<cfargument name="TargetPage" type="string" required="true"/>
<cfset outputCurrentLoginState("OnRequest",arguments.TargetPage)/>
<cfif findNoCase("signin/", arguments.TargetPage)>
<cflogout/>
</cfif>
<cfinclude template="#ARGUMENTS.TargetPage#" />
</cffunction>
</cfcomponent>
writeOutput(“函数中:#参数。当前函数#状态为
”);
writeOutput(“TargetPage:#arguments.TargetPage#
”);
writeOutput(“GetAuthUser:#GetAuthUser()#
”);
writeOutput(“GetUserRoles:#GetUserRoles()#
”);
书面会议(会议);
writedump(cookie);
写输出(“IsUserLoggedIn:#IsUserLoggedIn()#
”;
/*使用writeLog()查看控制台*/
result.cfm
<cfscript>
writeOutput("GetAuthUser: #GetAuthUser()#<br />");
writeOutput("GetUserRoles: #GetUserRoles()#<br />");
writeOutput("--- IsUserLoggedIn: #IsUserLoggedIn()#<br />");
writeOutput("At /result.cfm<hr/>");
</cfscript>
writeOutput(“GetAuthUser:#GetAuthUser()#
”);
writeOutput(“GetUserRoles:#GetUserRoles()#
”);
writeOutput(“--IsUserLoggedIn:#IsUserLoggedIn()#
”;
写输出(“At/result.cfm
”;
更新:现在我有了上面的测试代码,但在cf11中失败了,我在cf8服务器上试用了它,在cf8中它可以正常工作。会话超时时,用户在创建新会话时没有任何问题。只有在cf11中出现故障时才会显示。更新 关于这个问题,Adobe已经打开了一个bug-。我建议您添加您的经验并对该bug进行投票。它当前的状态为“ToTrack”,原因是“PRNeedInfo”。我也投了赞成票,并添加了对这个问题的参考以获取更多信息
从评论中提升 我认为问题在于您已将
标记的idletimeout
属性设置为一个比会话超时值(20秒)长的值(3600秒)。这不是一个有效的办法。我知道您已将会话超时设置为20秒,以便于测试。但是,当您将登录存储
设置为会话
时,将空闲超时时间设置为比会话超时时间更长是没有意义的。
标记试图保持用户会话处于活动状态,但会话本身在其控制范围之外被破坏。在我看来,这是自找麻烦。保持idletimeout设置小于或至少等于会话超时设置
我怀疑您看到的ColdFusion版本之间的差异可能与添加到ColdFusion 11中的
标记的新属性有关。allowconcurrent
属性()。默认情况下,该设置设置为true
,这意味着应该允许并发登录会话。尝试将该属性设置为false,如,
。我相信这将使
标记像在ColdFusion 8中一样工作
您在评论中提到,将allowconcurrent
设置为false
不是一个可接受的解决方案。为什么?这就是ColdFusion 8的工作原理。我觉得你看到的行为是“按设计工作”。但是,如果您觉得这是一个bug,那么
另外,我还注意到您正在将ClientManagement
和setClientCookies
都设置为false
。然而,在您的OnRequestStart
方法中,您正在设置这些cookie。为什么?会话管理不需要它们。ColdFusion服务器将为您处理此问题。更新
关于这个问题,Adobe已经打开了一个bug-。我建议您添加您的经验并对该bug进行投票。它当前的状态为“ToTrack”,原因是“PRNeedInfo”。我也投了赞成票,并添加了对这个问题的参考以获取更多信息
从评论中提升
我认为问题在于您已将
标记的idletimeout
属性设置为一个比会话超时值(20秒)长的值(3600秒)。这不是一个有效的办法。我知道您已将会话超时设置为20秒,以便于测试。但是,当您将登录存储
设置为会话
时,将空闲超时时间设置为比会话超时时间更长是没有意义的。
标记试图保持用户会话处于活动状态,但会话本身在其控制范围之外被破坏。在我看来,这是自找麻烦。保持idletimeout设置小于或至少等于会话超时设置
我怀疑您看到的ColdFusion版本之间的差异可能与添加到ColdFusion 11中的
标记的新属性有关。
<cflogin ..>
<cflogin ..>