我对coldfusion中的会话和客户端管理有些怀疑。
注意:当URL中提供CFID和CFTOKEN时,行为如下:如果会话存在,则忽略URL中的CFID和CFTOKEN。如果会话不存在,则使用URL中的CFID和CFTOKEN来验证会话,如果会话有效,则使用会话。如果会话无效,则会创建新会话。 CFID和CFTOKEN重新生成。
这是来自adobe ColdFusion online documentation的声明。以下是我的问题
答案 0 :(得分:1)
ColdFusion通过检查Cookie范围中是否存在CFID和CFTOKEN来检查有效会话。如果存在CFID和CFTOKEN cookie,它将使用cookie值来尝试和验证会话。如果它无法使用cookie值验证会话,它将使用URL值来尝试和验证会话。
答案 1 :(得分:1)
Using client and session variables without cookies
用户可以在浏览器中禁用Cookie。在这种情况下,ColdFusion无法自动维护客户端状态。通过在应用程序页面之间传递客户端标识信息,您可以使用客户端或会话变量而不使用cookie。但是,这种技术有很大的局限性,如下:
客户端变量实际上与会话变量相同,只是它们在客户端数据存储中留下不可用的数据。 由于客户端的系统不保留任何标识信息,因此下次用户登录时,ColdFusion无法识别具有先前客户端的用户,并且必须为该用户创建新的客户端ID。来自先前会话的有关用户的任何信息都不可用,但在ColdFusion删除之前保留在客户端数据存储中。如果清除ColdFusion Administrator中“保留未访问的客户端的清除数据”选项,ColdFusion将永远不会删除此数据。 因此,如果允许用户禁用cookie,请不要使用客户端变量。要在没有cookie的情况下保留客户端信息,请要求用户使用唯一ID进行登录。然后,您可以将用户特定信息保存在数据库中,并将用户的ID作为密钥。
每次用户直接在浏览器中请求页面时,ColdFusion都会创建一个新会话,因为新请求不包含指示会话或客户端的状态信息。
注意:您可以通过将Application.cfc中的This.setClientCookies变量或cfapplication标记的setClientCookies属性设置为No来阻止ColdFusion将客户端信息作为cookie发送到浏览器。
要在不使用cookie的情况下使用ColdFusion会话变量,每个页面必须将CFID和CFToken值传递给它作为请求URL的一部分调用的任何页面。如果页面包含任何HTML hrefa = links,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#">