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

Dan*_*ook 3 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>
Run Code Online (Sandbox Code Playgroud)

然后它继续进行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>
Run Code Online (Sandbox Code Playgroud)

如果从数据发布中不需要301重定向,这可以正常工作.

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

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

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

有帮助吗?谢谢

Tra*_*vis 5

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

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

另请参见其他结构函数

CF 9文档用于删除结构