如何在Coldfusion 11中设置和检查会话?

时间:2018-06-25 15:59:32

标签: coldfusion coldfusion-11

我对ColdFusion非常陌生。我正在构建一个非常基本的系统,如果成功登录,现在需要在其中设置会话变量。但是我不知道如何在ColdFusion中设置会话或如何在应用程序页面上检查会话。

我搜索了解决方案,但找不到令人满意的解决方案。我需要一些示例,其中在登录时设置了会话,并在注销时销毁了会话。 我已经读过Application.cfm,但是该文件位于何处? 这可能是一个简单的问题,并可能以某些方式重复出现。 谢谢。

1 个答案:

答案 0 :(得分:1)

首先您应该使用:

Application.cfc

您可以使用:

OnSessionStart

在这种情况下,您无需锁定会话变量,因为Coldfusion会处理此问题。 如果您在此方法之外设置会话变量,则可能需要锁定该变量,例如:

登录之前:

<cfif NOT StructKeyExists(session,"authenticated")>
  <cflock scope="session" timeout="30" type="exclusive">
    <cfset session.authenticated = false />
  </cflock>
</cfif>

创建新帐户:

用户登录时,请记住使用诸如BCrypt()之类的密码来哈希密码并存储在数据库中。不要加密密码,因为这些密码可能未加密,这可能会造成潜在的安全漏洞。

https://github.com/tonyjunkes/BCryptCFC

<cfset salt = BCrypt.genSalt()>
<cfset hash = BCrypt.hashString("password", salt)>

登录验证:

用户登录后,使用BCrypt()检查明文密码是否与数据库中的密码哈希匹配:

<cfset BCrypt.checkString("password", hash)>

还要检查“用户名” [电子邮件]是否匹配...

如果BCrypt()验证成功,则设置“会话”变量:

<cflock scope="session" timeout="30" type="exclusive">
  <cfset session.authenticated = true />
</cflock>

这是登录方式的非常基本的实现,但是它为您提供了入门的思路。

另一个提示是,如果您要锁定“会话”变量,则不必继续使用:

<cflock>

从会话中读取内容时,建议将“ sesssion”变量转换为“ variables”范围,例如:

<cflock scope="session" timeout="10" type="readOnly">
  <cfset variables.lckauthenticated = session.authenticated />
</cflock>

然后您可以使用:

variables.lckauthenticated

<cflock>标记之外。

现在,关于是否需要锁定“会话”变量存在一些争论,但是我的规则以及Adobe官方文档中建议的一项规则是,如果您正在读写,则锁定“会话”变量。它们在onSessionStart之外。

然后,当您的用户注销时,只需进行设置:

<cflock scope="session" timeout="30" type="exclusive">
  <cfset session.authenticated = false />
</cflock>

然后可以使用此标志来确定显示给用户的内容。 我通常会在成功登录期间设置几个“会话”变量,例如:

session.userid
session.roleid

“会话”轮换等其他内容也有助于保护您的会话,但这是另一篇文章的更高级主题...