ColdFusion 11以降の Cookie に空の文字列を指定した際の動作の違いについて

ColdFusion 10では、CFCookieタグを使ってCookie を生成する際に、ブラウザには下記のようなCookieが送られていました。これは ColdFusion10 ではTomcatの仕様動作によってCookieの値を渡さない処理に ""(二重引用符が2つ)が値と渡されていたためです。

Set-Cookie:"AAA=""; Expires=GMT時間; Path=/"

それがColdFusion 11以降では下記に変更されています。

Set-Cookie:"AAA=; Max-Age=86400; Path=/"

この変更によって注意する点があります。ColdFusionはブラウザから送られたCookieの情報をもとにCookie変数を生成しますが、Cookieの値が無いものについてはCookie変数を作成しないという動作になっています。この動作と上記の変更により、ColdFusion10まではCookieの値が空だった場合もCookie変数としてセットされていたものが、ColdFusion11以降ではCookie変数が作成されないという違いが生じます。

上記の動作は ColdFusion 11 Update 11で改善され、Cookie値が無いものについてもCookie変数として認識されるようになりました。

ColdFusion10と同じように二重引用符2つを指定したい場合は下記の方法のいずれかを行って下さい

  • ColdFusion 11以降で、空のCookieをセットする際に従来と同様に二重引用符2つを指定する
    • <cfcookie>タグで二重引用符を指定するとエンコードされてしまうため、<cfheader>タグを使用してSet-Cookieを行います
      • <cfheader name="Set-Cookie" value='AAA=""; Max-Age=86400 or Expires; Path=/'>
        • 補足①:cfcookieと動作を合わせるため、Cookie名(上記の場合はAAA)は大文字にします
        • 補足②:value="~” → value='~' (一重引用符で囲みます)
        • 補足③:Max-Age や Expires などの情報などは、cfcookieの動作を見て決めます(上記の Max-Age=86400; はcfcookieのexpires=1に相当します)
           
  • Cookie変数を参照する所で、CGI.HTTP_COOKIE 変数の情報をもとに、手動でCookie変数をセットする
    • 処理の先頭 Application.cfc や Application.cfm などで、<cfif>タグによる条件分岐をおこない <cfset>で空のCookieをセットします
      • <cfif FindNoCase("BBB=;",CGI.HTTP_COOKIE)>
            <cfset Cookie.BBB="">
            <cfdump var="#cookie#" label="BBB追加後">
        </cfif>

         
  • (ColdFusion 11 Update 9 のみ)ColdFusion Administratorの「サーバー設定」 >
    「Java と JVM」の「JVM 引数」に 「-Dcoldfusion.preserveemptycookies=true」を追加する
    • この設定を行うことで、Cookieを発行する処理の挙動が従来(Set-Cookie:"AAA=""; ~")に戻ります
      • 補足①:Cookieを取得する処理の仕様は変更されていません。値が指定されていないCookieは、引き続きCookie変数は作成されません
      • 補足②:JVM引数に値を指定する際は、改行を含めないでください
      • 補足③:追加後はColdFusion 11 Application Server Service を再起動してください
      • 補足④:ColdFusion2016には上記の設定は存在しないため、この方法を使用できません


 


記事公開日:2016年07月08日
最終更新日:2017年04月12日


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.