Недавно мы перешли на cf11 для проекта и столкнулись с необычной проблемой:
Когда пользователь разрешает тайм-аут своего сеанса и пытается снова войти в систему, ему требуется две попытки для успешного входа в систему.
Когда пользователь вручную выходит из системы, у него не возникает проблем со входом в систему.
Этой проблемы не было в CF8. Я изучил пользовательские области и не вижу разницы. Я пытался добавить код выхода перед входом в систему в надежде, что смогу сделать состояние таким же. Ни то, ни другое не сработало. Это известная проблема? И у вас есть предложение, что я могу попробовать?
РЕДАКТИРОВАТЬ:
У меня есть Application.cfc и result.cfm в корне проекта. У меня есть папка signin/ для страниц, которые не вошли в систему. Она содержит signin.cfm и onsignin.cfm, которые обрабатывают аутентификацию. При запуске кода дождитесь истечения времени сеанса, прежде чем снова войти в систему с тем же именем пользователя.
вход/signin.cfm
<form action="onsignin.cfm" method="POST" >
User name: <input name="login" type="text" />
<input type="submit" value="Login" name="btnSubmit" >
</form>
вход/onsignin.cfm
<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. --->
Приложение.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>
результат.cfm
<cfscript>
writeOutput("GetAuthUser: #GetAuthUser()#<br />");
writeOutput("GetUserRoles: #GetUserRoles()#<br />");
writeOutput("--- IsUserLoggedIn: #IsUserLoggedIn()#<br />");
writeOutput("At /result.cfm<hr/>");
</cfscript>
Обновление: теперь у меня есть приведенный выше тестовый код, который не работает для cf11, я попробовал его на сервере cf8, и в cf8 он работает так, как я ожидал. Когда время сеанса истекает, у пользователя не возникает проблем с созданием нового сеанса. Только в cf11 он не работает.
allowconcurrent
, который был добавлен в ColdFusion 11 и по умолчанию имеет значениеtrue
. Попробуйте установить для этого атрибута значение false<cflogin idletimeout="3600" allowconcurrent="false">
, чтобы тегcflogin
работал так, как он использовался в ColdFusion 8. Я думаю, что настоящий корень проблемы в том, что у вас более короткий тайм-аут сеанса (здесь 20 секунд), чем у теговcflogin
idletimeout
( 3600 секунд здесь). Поскольку вы установилиloginStorage
наsession
, тегcflogin
пытается удержать пользователя, но сеанс разрывается. - person Miguel-F   schedule 09.03.2015idletimeout
, чтобы он был меньше или соответствовалsessiontimeout
, но это не повлияло на результат, и ошибка осталась той же. Однако заменаallowconcurrent
наfalse
действительно меняет результат. Спасибо, что заметили это. Изменениеallowconcurrent
не будет приемлемым решением для моего приложения. Это похоже на недокументированную ошибку в cf11. - person user619882   schedule 09.03.2015