【问题标题】:Setting up Session variable in Application.cfc在 Application.cfc 中设置 Session 变量
【发布时间】:2014-06-13 16:39:00
【问题描述】:

您好,我对 ColdFusion 10 非常陌生,尤其是 Application.cfc。这非常令人困惑。 我创建了 Application.cfc 并在这个 cfc 中创建了以下内容:

我的问题是:
1. 为什么会出现会话错误? (见下面我的代码)

2. sessionEnd 函数应该放什么?

  <!--- Application.cfc --->
   <CFCOMPONENT displayname="Application" output="true">

     <cfset THIS.Name = "MyTestApp" />
     <cfset THIS.ApplicationTimeout = CreateTimeSpan(0,0,60,0) />
     <cfset THIS.SessionManagement = true />
     <cfset THIS.SessionTimeout = CreateTimeSpan( 0, 0, 30, 0 ) />
     <cfset THIS.SetClientCookies = false />

    <cfset THIS.SetClientCookies = false />

    <cffunction name="OnApplicationStart" access="public" 
                                          returntype="boolean" output="false">

       <cfset application.Main_DSN = "MyTestDB">

    </cffunction>



    <cffunction name="onApplicationEnd" output="false"> 
       <cfargument name="applicationScope" required="true">

    </cffunction>


    <cffunction name="OnSessionStart" access="public" returntype="void" output="false" 
                                         hint="Fires when user session initializes">

       <cfset session.loggedin = "NO">
       <cfset session.username = "">
       <cfset session.userrights = "">
       <cfset session.usergroup = "">  

  </cffunction>


 <!--- After user login, I have checklogin.cfm --->
 <cfif mylogin NEQ true><!--- Login failed, go redirect to login page --->
    <cflocation url="login.cfm"> 
 <cfelse>
       <cfset session.loggedin = "YES"><!--- ??? error: see below --->
   <cfset session.username = "#Trim(Form.username)#">
   <cfset session.userrights = "#Trim(Form.userrights )#">
   <cfset session.usergroup = "#Trim(Form.usergroup)#">     
 </cfif>

 <cffunction name="onSessionEnd">

    <!--- Not sure what can I put in here????? --->    

 </cffunction>

【问题讨论】:

  • 您不必在 onSessionEnd() 中添加任何内容。如果您想在会话超时时执行某些操作,它就在那里。有些人会在会话超时时将会话数据保存到数据库或磁盘中,然后在下次用户登录时将其备份,以便他们可以从上次中断的地方继续。
  • 您可能想在 Application.cfc 上查看本教程:bennadel.com/blog/…
  • 对不起!!成功登录后出现的错误是:元素 LOGGEDIN 在 SESSION 中未定义。但实际上我已经在 OnsessionStart 函数中声明了它。我在 OnsessionStart 中声明了几个会话变量。成功登录后,我应该能够为这些会话变量赋值。这是我的理解。到目前为止,这是我唯一的问题,CF 没有检测到 session.LoggedIn,是的,似乎 OnSessionStart 没有触发,我该怎么办?
  • 好的,正如您解释的那样,一旦应用程序启动, OnsessionStart 应该已经触发。我做了一些测试,并将 cfdump 用于登录表单中的所有会话变量(其中之一是 cfset session.loggedIn = "No")。当我点击登录表单时,在我开始登录之前,我可以看到我的会话变量!!!我可以看到我的会话变量已初始化,session.LoggedIn 值为“否”。现在不太好的消息是,当我在成功登录后分配 session.loggedIn="Yes" 时,我仍然得到相同的“Element LOGGEDIN is undefined in SESSION.”,我不明白。
  • mkross1983,感谢您抽出宝贵时间回复并帮助我。这是怎么回事:我的登录代码不在 OnsessionStart 或任何函数中。登录表单发布到 checklogin.cfm。登录验证在 checklogin.cfm 中完成。在这里,一旦用户被验证,我将值分配给我之前在 OnsessionStart 函数中设置的那些会话变量,但错误表明元素 LOGGEDIN 在 SESSION 中未定义。在 OnSessionStart 我设置 就是这样。在 checklogin.cfm 上,当用户成功验证时,我分配“YES”。

标签: coldfusion coldfusion-10 application.cfc


【解决方案1】:

您的登录代码位于 Application.cfc 文件中的任何事件处理程序之外,因此该代码将首先运行...在任何事件处理程序之前!

Application.cfc中代码的执行顺序为:

  • 任何事件处理程序之外的代码(无论它在文件中的什么位置)
  • onApplicationStart()
  • onSessionStart()
  • onRequestStart()

因此,您不能让代码在其他事件处理程序之外引用会话范围(或应用范围)。您只能在onSessionStart() 触发后开始使用会话变量。以前没有。

【讨论】:

  • 我认为这个问题的代码清单是乱序的。他们在代码 cmets 中引用 checklogin.cfm,然后开始列出更多 Application.cfc。至少这是我对它的解释......
  • 这绝对是可能的,但我只需要继续该人发布的内容。如果我们得到更清晰的信息,我会修改。基本上我是按要求回答的问题,这可能不是这个人应该问的问题;-)
【解决方案2】:

您收到的错误信息是什么?

你真的可以在会话结束时放任何东西。会话结束后您需要运行以清理的任何内容。

也许您想更新日志或发送电子邮件、清除 cookie 或重定向到某个页面。

编辑:

Application.cfc 中的其他所有内容都适合您吗?似乎 onSessionStart 事件没有触发。

编辑 2:* 很抱歉通过回答这样做,但我需要更多代表才能离开 cmets。

会话应在您连接到应用程序后立即开始,您无需像验证凭据那样等待“登录”。

如果会话变量不存在,则事件由于某种原因没有触发。确保您拥有正确的文件名,并且它位于应用程序的根文件夹中。

编辑 3: 您的登录代码不在 onSessionStart 函数中,不在任何函数中。除非我误解了您的评论并且您说代码部分在“checklogin.cfm”文件中,而不是在 Application.cfc 文件中。

编辑 4: 我需要接听客户的电话,但之后我可以提供更多帮助。我们可能需要查看 checklogin.cfm 文件的一部分。

编辑 5: 运气好吗?

编辑 6: 抱歉耽搁了,今天下午音量正在增加。

此时我想我要么需要查看正在执行验证检查的代码,要么询问您是否确定验证工作正常。

我假设您正在连接到数据库,如果您使用查询来验证登录凭据并在 SQL Server 中运行它,或者不将您要键入的值插入到表单中,您会得到任何结果吗?

编辑 7: 搞清楚了吗,欧巴?

【讨论】:

  • 我刚刚在上面发布了我的解释
  • 所以我在 OnSessionStart 函数中设置了 session.loggedin="NO" 然后在用户成功验证后我将 session.loggedIn 分配为“是”但 CF 抛出错误说“在 SESSION 中未定义元素 LOGGEDIN。 ”。不是在 OnSessionStart 中定义的吗?
  • mkross1983,很抱歉上周未能回复。是的,如果数据库连接正常,则转储结果并可以看到查询结果。就在我 cfset session.loggedIn = "yes" CF 抛出错误时。我可以通过电子邮件将我的代码发送给您,以便您查看吗?这里没有地方让我展示我的代码。
  • 我很乐意帮助编写代码,但不知道如何在此处直接向您发送消息。我会调查的。
  • 似乎 SO 不允许这样做。我会设置一个扔掉的帐户,并期望它会像疯了一样被垃圾邮件发送,但这没关系。 meta.stackexchange.com/questions/431/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多