会话在冷聚变中如何工作?



我对冷融合中的会话和客户端管理有一些疑问。

注意:当 URL 中提供 CFID 和 CFTOKEN 时,行为如下:如果会话存在,则忽略 URL 中的 CFID 和 CFTOKEN。如果会话不存在,则使用 URL 中的 CFID 和 CFTOKEN 来验证会话,如果会话有效,则使用会话。如果会话无效,则会创建一个新会话。CFID和CFTOKEN被重新生成。

这是来自Adobe ColdFusion在线文档的声明。以下是我的问题

  1. ColdFusion 如何在没有 CFID 和 CFTOKEN 帮助的情况下检查会话是否存在,如第一句话所示?
  2. 假设我们使用的是 ColdFusion 会话管理,如果 CFTOKEN 和 CFID 在登录后没有变化,我们可以劫持会话吗?

ColdFusion 通过检查 cookie 范围内是否存在 CFID 和 CFTOKEN 来检查有效会话。如果 CFID 和 CFTOKEN Cookie 存在,它将使用 cookie 值来尝试验证会话。如果无法使用 Cookie 值验证会话,它将使用 URL 值来尝试验证会话。

使用不带 cookie 的客户端和会话变量

用户可以在浏览器中禁用 Cookie。在这种情况下,ColdFusion 无法自动维护客户端状态。通过在应用程序页之间传递客户端标识信息,可以在不使用 Cookie 的情况下使用客户端或会话变量。但是,此技术具有明显的局限性,如下所示:

客户端变量
  1. 实际上与会话变量相同,只是它们在客户端数据存储中留下不可用的数据。 由于客户端的系统不保留任何标识信息,因此下次用户登录时,ColdFusion 无法将用户与以前的客户端标识,必须为该用户创建新的客户端 ID。上一个会话中有关用户的任何信息都不可用,但会保留在客户端数据存储中,直到 ColdFusion 将其删除。如果清除 ColdFusion 管理器中的"清除未访问的客户机的数据"选项,则 ColdFusion 永远不会删除此数据。 因此,如果您允许用户禁用 Cookie,请不要使用客户端变量。要在没有 Cookie 的情况下保留客户信息,请要求用户使用唯一 ID 登录。然后,您可以使用用户的 ID 作为键将用户特定的信息保存在数据库中。

  2. 每次用户直接在浏览器中请求页面时,ColdFusion 都会创建一个新会话,因为新请求不包含指示会话或客户端的状态信息。

注: 您可以通过在 Application.cfc 中设置 This.setClientCookies 变量或将 cfapplication 标记的 setClientCookies 属性设置为"否"来阻止 ColdFusion 将客户端信息作为 Cookie 发送到浏览器。

要在不使用 Cookie 的情况下使用 ColdFusion 会话变量,每个页面都必须将 CFID 和 CFToken 值传递给它作为请求 URL 的一部分调用的任何页面。如果页面包含任何 HTML hrefa= 链接、cflocation 标记、表单标记或 cfform 标记,则标记必须在标记 URL 中传递 CFID 和 CFToken 值。要使用 J2EE 会话管理,请在页面请求中传递 jsessionid 值。要使用 ColdFusion 客户机变量和 J2EE 会话变量,请在 URL 中传递 CFID、CFToken 和 jsessionid 值。

注意:当 URL 中提供 CFID 和 CFTOKEN 时,行为如下:如果会话存在,则忽略 URL 中的 CFID 和 CFTOKEN。如果会话不存在,则使用 URL 中的 CFID 和 CFTOKEN 来验证会话,如果会话有效,则使用会话。如果会话无效,则会创建一个新会话。CFID和CFTOKEN被重新生成。

ColdFusion 提供了 URLSessionFormat 函数,该函数执行以下操作:

如果客户端不接受 Cookie,则会自动将所有必需的客户端标识信息附加到 URL。

如果客户端接受 cookie,则不会附加信息。 URLSessionFormat 函数自动确定需要哪些标识符,并仅发送所需的信息。它还提供了一种比手动编码每个 URL 中的信息更安全、更可靠的方法来支持客户端识别,因为它只在需要时发送所需的信息,并且更容易编码。

若要使用 URLSessionFormat 函数,请将请求 URL 括在函数中。例如,以下 cfform 标记将请求发布到另一个页面,并在必要时发送客户端标识:

<cfform method="Post" action="#URLSessionFormat("MyActionPage.cfm")#>

如果在多个 URLSessionFormat 函数中使用相同的页面 URL,则通过将格式化的页面 URL 分配给变量,可以获得较小的性能改进并简化代码,例如:

<cfset myEncodedURL=URLSessionFormat(MyActionPage.cfm)> 
<cfform method="Post" action="#myEncodedURL#">

最新更新