Application.cfm在301重定向后缺少会话变量

时间:2012-12-03 16:05:49

标签: coldfusion http-status-code-301 coldfusion-7 application.cfm

运行ColdFusion 7。

Application.cfm将所有session个变量循环到request.session

OnRequestEnd.cfm将所有request.session值循环回session

这样做是为了在单个事务中编写变量时只需要锁定范围一次。 (我相信这不再是一个问题了吗?但我不能完全撕掉它。)

我有一个'redirect.cfm'页面,它提供301重定向到SEO URL或传递内容。某些表单发布到旧URL,因此需要301重定向,这会导致POST数据丢失。这就是我打算处理它的方式。

<!--- 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>

如果数据发布中不需要301重定向,则此方法可以正常工作。

通过301重定向,我确认了Application.cfm,OnRequestEnd.cfm都运行了两次(一次用于初始301,一次用于内容传送)。

在第一个OnRequestEnd.cfm调用结束时,使用表单数据正确填充session.postdata

301重定向后再次点击Application.cfm,session.postdata返回'struct [empty]'

有任何帮助吗?感谢

2 个答案:

答案 0 :(得分:5)

structCopy()创建结构的浅表副本,这意味着嵌套结构仅供参考,这就是为什么您的简单值保持不变但嵌套结构不存在的原因。一旦您的表单结构不再包含数据,您的postData结构就开始引用一个空结构,因此您的引用也是空的。

要对结构执行“深层复制”,请使用duplicate()

另见other structure functions

CF 9 documentation for deleting structures

答案 1 :(得分:0)

[更新:此答案错误。我只是留在这里,因为我做了一些interesting investigation into the situation,这可能值得人们阅读]

@Travis说的是问题 - “当表单结构不再存在时,你的postdata结构也不存在” - 绝对不是真的。对表单范围的引用可能已经消失,但只要有任何对数据的引用(如request.session.postData),那么底层对象将被删除

问题可能在于,当您进行重定向时,OnRequestEnd.cfm不会针对该请求运行,因此request.session中的变量永远不会被复制到会话范围中。这一切都取决于你如何进行重定向。我已经假设它已经使用了<cflocation>,除非你说你使用的CFMX7不能做301(你说你正在做):它只能做你能说清楚你是如何进行这种重定向的吗?欢呼声。

Digression:在继续使用所有这些传统的会话锁定恶作剧时,你会在请求的任何一端添加相当多的开销和瓶颈。你真的应该留出一些时间来全力以赴。自CF5以来,这种锁定会话范围锁定随身携带并不是必需的。此外,如果您的会话范围包含结构,那么无论如何您都无法解决问题。显然,这是一个旁白;与你的实际问题无关。我只是觉得值得一提。