3

ColdFusion7を実行しています。

sessionApplication.cfmは、すべての変数をループしますrequest.session

OnRequestEnd.cfmは、すべてのrequest.session値をループバックしますsession

これを行うので、単一のトランザクションで変数を書き込むときにスコープをロックする必要があるのは1回だけです。(これはもうそれほど問題ではないと思いますか?それでも、正確にそれを取り除くことはできません)。

SEO URLへの301リダイレクトを提供するか、コンテンツを配信する「redirect.cfm」ページがあります。一部のフォームは古いURLに投稿するため、POSTデータが失われる301リダイレクトが必要です。これが私がそれを処理することを意図した方法です。

<!--- 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の両方が2回実行されることを確認しました(最初の301で1回、コンテンツ配信で1回)。

最初のOnRequestEnd.cfm呼び出しの終わりまでにsession.postdata、フォームデータが正しく入力されます。

301リダイレクトの後、Application.cfmに再びヒットすると、session.postdata「struct[empty]」が返されます。

何か助けはありますか?ありがとう

4

2 に答える 2

5

structCopy()は、構造の浅いコピーを作成します。つまり、ネストされた構造は参照のみであるため、単純な値は保持されますが、ネストされた構造は保持されませんでした。フォーム構造にデータが含まれなくなると、postData構造は空の構造を参照し始めたため、参照も空になります。

構造の「ディープコピー」を実行するには、duplicate()を使用します

他の構造関数も参照してください

構造を削除するためのCF9ドキュメント

于 2012-12-03T17:20:00.333 に答える
0

[更新:この答えは間違っています。状況について興味深い調査を行ったので、ここに残しておきました。これは、読む価値があるかもしれません]

@Travisが言ったことは、「フォーム構造が存在しなくなると、postdata構造も存在しない」という問題でした。これは絶対に真実ではありません。フォームスコープへの参照がなくなっている可能性がありますが、データへの参照(などrequest.session.postDataがある限り、基になるオブジェクトは削除されません。

問題は、リダイレクトを実行すると、OnRequestEnd.cfmがその要求に対して実行されないため、request.sessionの変数がセッションスコープにコピーされないことである可能性があります。それはすべて、リダイレクトをどのように行っているかによって異なります。<cflocation>あなたが301を行うことができないCFMX7を使用しているとあなたが言うことを除いて、私はそれがあったと思いました(あなたがしているとあなたが言っている):それは302しか行うことができません。plsは、このリダイレクトをどのように行っているかを明確にしますか?乾杯。

Digression: you're adding quite a lot of overhead plus a bottleneck at either end of the request in continuing with all this legacy session-locking shenanigans. You really ought to put aside some time to pull it all out. This locking session-scope-locking carry-on hasn't been necessary since CF5. Also if your session scope contains structs, you're not mitigating the problem anyhow. This is, obviously, an aside; and nothing to do with your actual question. I just figured it was worth mentioning.

于 2012-12-03T20:44:36.700 に答える