我正在建立一个网站,我跟踪MVC来管理我的代码而不使用任何框架。我将所有查询都放在cfcs中,并在Application.cfm中初始化它们,将它们存储在如下的应用程序变量中:
<cfset aplication.customerProfileObject=
createObject("component","cfc.customerprofile").init()>
要执行任何查询操作,我已经创建了一个函数,然后在任何地方调用它:
<cfset selectedCustomerOb =
application.customerProfileObject.getContactCustomerProfileDetail(session.userid)>
我不知道导致此问题的原因,但有时用户会访问其他用户的数据。怎么可能?是评估另一个用户的会话数据还是我初步化了cfc错误?
应用程序设置如下:
<cfapplication name="MyDataSourceName"
sessionmanagement="Yes"
setclientcookies="yes"
setdomaincookies="yes"
loginstorage="session"
sessiontimeout="#CreateTimeSpan(0, 2,0,0)#">
CustomerProfile.cfc
<cfcomponent>
<cffunction name="init">
<cfreturn this>
</cffunction>
<cffunction name="getContactCustomerProfileDetail" returntype="query"
description="Returns customer contact details by contactid"
access="public">
<cfargument name="ccId" type="numeric" required="yes">
<cfquery name="getContactCustomerProfileDetail"
datasource="#Application.ds#"
dbtype="ODBC"
username="#Application.UserName#"
password="#Application.Password#">
<!-------My query here--->
</cfquery>
<cfreturn getContactCustomerProfileDetail>
</cffunction>
</cfcomponent>
答案 0 :(得分:4)
正如亚当所说,你需要这样做: -
<cffunction name="getContactCustomerProfileDetail" returntype="query"
description="Returns customer contact details by contactid"
access="public">
<cfargument name="ccId" type="numeric" required="yes">
<cfset var getContactCustomerProfileDetail = false>
<cfquery name="getContactCustomerProfileDetail"
datasource="#Application.ds#"
dbtype="ODBC"
username="#Application.UserName#"
password="#Application.Password#">
<!-------My query here--->
</cfquery>
<cfreturn getContactCustomerProfileDetail>
</cffunction>
您遇到问题的原因是您的CFC实例位于共享范围(应用程序)中,并且您没有对查询变量进行var。这意味着它将被设置到CFC实例的变量范围中。这意味着多个线程可以覆盖此值。通过对变量进行修改,如我所示,您将变量置于函数的本地,因此每次调用该函数都会创建一个本地化的线程安全变量。
基本上你应该根据习惯改变函数中的所有局部变量。这段代码永远不会通过我工作过的任何地方的代码审查。
答案 1 :(得分:3)
您实际上并没有包含代码的相关位来回答这个问题......这将是getCustomerProfileDetail()
中的代码。
但是我假设你没有变量中的所有变量,这意味着它们进入CFC的变量范围,该范围与应用程序中的每个用户共享。
但是,正如我所说,你没有给我们正确的信息来准确回答这个问题。我建议您更新问题以包含相关代码。