3

运行 ColdFusion 7。

sessionApplication.cfm 将所有变量循环到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]”

有什么帮助吗?谢谢

4

2 回答 2

5

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

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

另见其他结构函数

用于删除结构的 CF 9 文档

于 2012-12-03T17:20:00.333 回答
0

[更新:这个答案是错误的。我只是把它留在这里,因为我对这种情况进行了一些有趣的调查,这可能值得人们阅读]

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

问题很可能是当您进行重定向时, OnRequestEnd.cfm 不会针对该请求运行,因此 request.session 中的变量永远不会被复制到会话范围中。这完全取决于您如何进行重定向。我假设它已经与 a 一起使用<cflocation>,除非您说您使用的 CFMX7 不能执行 301(您说您正在执行):它只能执行 302。你能请澄清你是如何做这个重定向的?干杯。

题外话:在继续所有这些遗留的会话锁定恶作剧时,您会在请求的两端添加相当多的开销和瓶颈。你真的应该留出一些时间把它全部拿出来。自 CF5 以来,这种锁定会话范围锁定的携带就没有必要了。此外,如果您的会话范围包含结构,那么无论如何您都不会缓解问题。这显然是一个旁白。与您的实际问题无关。我只是觉得值得一提。

于 2012-12-03T20:44:36.700 回答