CatalystのStatic::SimpleとSessionの相性が悪い
CatalystのCatalyst::Plugin::Static::SimpleとCatalyst::Plugin::Session(::State::Cookie)の相性が悪い。最悪の場合セッションキーが消されてしまう。
原因はprepare_actionの実行順で、解決策としてはプラグインのロードの順番なのだが、
use Catalyst qw/Static::Simple Session/
とした場合、
prepare_actionはStatic::Simpleの方が先に実行される。ところがStatic::Simpleのprepare_actionは、
return $c->NEXT::ACTUAL::prepare_action(@_);
で終わるため、Sessionではなく、SUPER:: prepare_action(つまり、、、Catalyst:: prepare_action?)と同じ事になってしまい、Sessionをロードするための、Session:: prepare_actionが読み出されなくなってしまう。
解決策はプラグインのロードの順番で、
use Catalyst qw/Session Static::Simple/
とすればいい。ドキュメントにも書いてありました。
This can be helpful by skipping session cookie checks for example. Or, if you want some plugins to run even on static files, list them before Static::Simple.
ただし、その「session cookie checks」のskipが原因だったのですが。
かなり悩んでしまった。
実際の問題点は、Catalyst::Plugin::Sessionのdump_theseかなぁ
$c->sessionid ? ( [ "Session ID" => $c->sessionid ], [ Session => $c->session ], ) : ()
Catalyst::Plugin::Session::State::Cookieでsessionidが設定されているから、「$c->session」が実行されてしまい、sessionメソッドの中でgenerate_session_idしてしまうと。修正するなら、
$c->sessionid && $c->{session} ? ( [ "Session ID" => $c->sessionid ], [ Session => $c->session ], ) : ()
かなぁ。。