サーバーに渡される引数がAPIリクエスト、フォーム送信、ajaxリクエストなどのいずれであるかを指定しないため、反対側の実装に違いがあります。ただし、ColdFusionサーバーの端は非常に似ている必要があり、基本的に3つの問題があります。タイムゾーン、時間の不一致、および遅延。
タイムゾーンの問題を解決するには、引数をUTC時間として渡すように要求できます。時間をColdfusionと比較すると、次のようになります。
<cfif DateDiff("s", Variables.PassedTimestamp, DateConvert( "Local2UTC", Now() )) EQ 30>
<!--- Exactly 30 seconds difference between timestamps --->
</cfif>
ただし、送信された時刻がサーバーの時刻と同期しているかどうかはわかりません。これを支援するために、相手側が自分の時間を照会し、それに応じて時間を調整するか、自分の時間をエコーバックする方法を提供できます。
その時間の同期と最初に議論されたタイムスタンプの送信は両方とも待ち時間に悩まされます。ネットワークを介した通信は、遅延のレベルが異なるだけで、遅延の影響を受けます。場所とインターネット接続の種類は、プロトコルの種類よりも大きな影響を与える可能性があります。もう一方の端にpingを実行して応答時間を取得し、それを半分にしてタイムスタンプに追加するようなこともできますが、それでも概算であり、すべてのサーバーがpingに応答するわけではありません。
さらに、サーバーともう一方の端のコードも遅延を引き起こします。これを減らすには、もう一方の端でリクエストの最後にできるだけ近いタイムスタンプを計算し、コードでできるだけ早くタイムスタンプを計算する必要があります。これは、ColdFusionで、Application.cfm|cfcの最上部にできるだけ近いリクエスト時間を設定することで実行できます。
<cfset Request.Now = Now()>
次に、チェックコードを次のように変更します。
DateDiff("s", Variables.PassedTimestamp, DateConvert( "Local2UTC", Request.Now ))
代わりに、30秒が経過するまでループしてから応答する場合は、待ち時間によって応答がもう一方の端に戻るのが遅れるため、30秒後に応答が発生しないように見えることに注意してください。
正確に30秒を取得することは不可能ですが、より近づくための手順を実行します。約30秒が経過したかどうかを確認する必要がある場合は、それで十分です。