运行ColdFusion 7。
Application.cfm将所有session变量循环到request.session中
OnRequestEnd.cfm将所有request.session值循环回到session中
它这样做,所以在单个事务中写入变量时,它只需要锁定作用域一次。(我相信这不再是什么大问题了?然而,我不能准确地把它拔出来)。
这就是我打算如何处理它。
<!--- if form scope exists (posted data) copy it to the request.session scope --->
<cfif structKeyExists(form,'fieldNames')>
<cfset request.session.postData = structCopy(form)>
</cfif>然后,它转到301重定向,当它返回到redirect.cfm以交付内容时,它会运行以下代码
<!--- if request.session.postData exists (posted data) copy it to the form scope --->
<cfif structKeyExists(request.session,'postData')>
<cfset form = structCopy(request.session.postData)>
<cfset StructDelete(request.session,'postData')>
</cfif>如果数据的post中不需要301重定向,则可以很好地工作。
在第一次OnRequestEnd.cfm调用结束时,表单数据正确地填充了session.postdata。
在301重定向之后,它再次命中Application.cfm,session.postdata返回'structempty‘
有什么帮助吗?谢谢
发布于 2012-12-04 01:20:00
structCopy()创建了该结构的浅层副本,这意味着嵌套结构只能通过引用来实现,这就是为什么您的简单值仍然存在,而您的嵌套结构却没有。一旦表单结构不再包含数据,postData结构就开始引用空结构,因此引用也是空的。
要对结构进行“深度复制”,请使用duplicate()
另请参阅other structure functions
CF 9 documentation for deleting structures
发布于 2012-12-04 04:44:37
[更新:这个答案是错误的。我只是把它留在这里,因为我做了一些interesting investigation into the situation,这可能值得人们阅读]
@Travis所说的问题--“当表单结构不再存在时,你的postdata结构也不再存在”--绝对不是真的。对表单作用域的引用可能已经消失,但只要存在对数据的引用(如request.session.postData),底层对象就不会被删除。
问题很可能是,当您执行重定向时,OnRequestEnd.cfm不会为该请求运行,因此request.session中的变量永远不会复制到会话范围中。这完全取决于您如何进行重定向。我假设它是一个<cflocation>,除非你说你正在使用CFMX7,它不能做301 (你说你正在做的):它只能做302。你能澄清一下你是如何做这个重定向的吗?干杯。
题外话:在继续使用所有这些遗留的会话锁定骗局时,您会在请求的两端增加相当多的开销和瓶颈。你真的应该留出点时间把它们都拉出来。从CF5开始,这种锁定会话作用域锁定就不再是必需的了。另外,如果您的会话作用域包含结构,则无论如何都不能减轻问题。显然,这是一个附带问题;与您的实际问题无关。我只是觉得值得一提的是。
https://stackoverflow.com/questions/13687135
复制相似问题