用户数据在某些时候变得混乱

时间:2013-12-13 20:57:28

标签: coldfusion cfc application.cfm

我正在建立一个网站,我跟踪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>  

2 个答案:

答案 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的变量范围,该范围与应用程序中的每个用户共享。

但是,正如我所说,你没有给我们正确的信息来准确回答这个问题。我建议您更新问题以包含相关代码。