无法在表达式中编辑/使用变量,但我可以输出它

时间:2014-11-20 21:48:40

标签: coldfusion scope

我在方法中有以下代码:

<cffunction name="serviceTicketValidate" access="public" output="yes" returntype="void" hint="Validate the service ticket">
<cfargument name="service_ticket" type="string" required="yes" hint="The ST to validate" />

<!--- Contact the CAS server to validate the ticket --->
<cfhttp url="#Variables.cas_server#serviceValidate" method="get">
  <cfhttpparam name="ticket" value="#Arguments.service_ticket#" type="url" />
  <cfhttpparam name="service" value="#Variables.service#" type="url" />
</cfhttp>

<!--- Received a valid XML response --->
<cfif IsXML(cfhttp.FileContent)>
  <cfset XMLobj = XmlParse(cfhttp.fileContent)>

  <!--- Check for the cas:user tag --->
  <cfset CASuser = XmlSearch(XMLobj, "cas:serviceResponse/cas:authenticationSuccess/cas:user")>
  <!--- Set the username to the value --->
  <cftry>
  <cfif variables.username NEQ ''>
    <cfdump var="#Variables.username#" /><cfreturn/>
    </cfif>
  <cfif ArrayLen(CASuser)>
        <cfset Variables['username'] = CASuser[1].XmlText />
  </cfif>
  <cfcatch>
    <cfdump var="#cfcatch#" /><cfabort/>
  </cfcatch>
  </cftry>

  <!--- Search for cas:attributes --->
  <cfset CASattributes = XmlSearch(XMLobj, "cas:serviceResponse/cas:authenticationSuccess/cas:attributes")>

  <!--- Go through all the attributes and add them to the attributes struct --->
  <cfif ArrayLen(CASattributes)>
    <cfloop array=#CASattributes[1].XmlChildren# index="attribute">
      <cfset StructInsert(Variables.attributes,RemoveChars(attribute.XmlName,1,Find(":",attribute.XmlName)),attribute.XmlText)/>
    </cfloop>
  </cfif>
</cfif>

注意我添加了cftrycfcatch以查看具体情况。我还将if username != blank添加到调试中。此方法在另一种方法中调用,如下所示:

<cfinvoke method="serviceTicketValidate">
      <cfinvokeargument name="service_ticket" value="#service_ticket#" />
    </cfinvoke>
    <cfdump var="test2" /><cfabort/>

我再次为dump添加了testing和中止。当组件启动并且组件被启动到会话变量中时,variable.username被定义并设置为空字符串。

所以得到这个...当整个过程第一次在我的屏幕test2上按预期输出时运行。然后,下次运行相同的事情时,会话就存在,因此variable.username被设置为某个东西。在第一个代码块中,我可以转储variables.username并查看用户名。但是,如果我尝试在条件表达式中使用variables.username(如在if语句中)或者如果我删除if语句并让脚本尝试更改variable.username的值,则没有错误,它只是彻底打破了剧本。它结束了那个方法,以及调用它的方法,我没有像我想的那样看到test2。这一切都因某种原因而结束。

如果您需要更多详细信息,我可以提供更多代码,但我试图尽量减少我认为相关的内容。所有方法都在同一个组件中,所有方法都是公共的。为什么我不能更改variables.username的值以及为什么没有错误?

编辑:

我认为这可能与cflock有关,但我现在正在调试一些东西。我在锁内部的代码块内部进行了重定向。所以我猜它永远不会解锁。但我甚至在超时后等待它仍然保持锁定状态。我认为锁定应该在超时后到期。

1 个答案:

答案 0 :(得分:0)

我有点困惑,但似乎您正在尝试使用cfc的变量范围来设置调用者变量。调用者无法以您尝试使用它的方式使用变量范围。

<强> index.cfm

<cfoutput>
<cfset objTest = createObject("component", "testscope").init()><br><Br>
<cfset objTest.checkValue()><br><br>
Calling page is checking the existence of testvar: #isDefined("variables.testvar")#
</cfoutput>

<强> testscope.cfm

<cfcomponent displayname="testscope">
    <cffunction name="init" access="public">
        init() just set variables.testvar.
        <cfset variables.testvar = "Okay, set">
        <cfreturn This>
    </cffunction>

    <!--- Set some more variables --->
    <cffunction name="checkValue" access="public">=
        <cfoutput>Checkvalue is checking the value of testvar: #variables.testvar#</cfoutput>
    </cffunction>
</cfcomponent>

输出

init() just set variables.testvar. 

Checkvalue is checking the value of testvar: Okay, set 

Calling page is checking the existence of testvar: false