我在方法中有以下代码:
<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>
注意我添加了cftry
和cfcatch
以查看具体情况。我还将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
有关,但我现在正在调试一些东西。我在锁内部的代码块内部进行了重定向。所以我猜它永远不会解锁。但我甚至在超时后等待它仍然保持锁定状态。我认为锁定应该在超时后到期。
答案 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