■sessionの設定
・Webコンテナの設定
$CATALINA_HOME/conf/web.xml
・Webモジュール独自の設定
$CATALINA_HOME/webapps/コンテキスト名/WEB-INF/web.xml
※設定内容は<session-config>タグに書く
※Webモジュール独自の設定はWebコンテナの設定を上書きする
【疑問】
$CATALINA_HOME/conf/context.xml に書く設定と上記に書く設定は何が違うのか?
【疑問】
tomcat8のデフォルトのsession managerは何か?
→Tomcatのセッションレプリケーションに下記の3種類が提供されている。
・DeltaManager
・BackupManager
・PersistenceManager
(参照:http://tech.synchro-food.co.jp/entry/2016/06/06/103003)
【疑問】
・session managerの変更方法
・各session manegerの設定方法
■sessionの保持と永続性
1.context.xmlがデフォルト設定の場合
(1) context.xmlのデフォルト設定
せ70> cat $CATALINA_HOME/conf/context.xml
<?xml version="1.0" encoding="UTF-8"?>
---(略)---
<Context>
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
</Context>
(2) SESSION.serファイル
せ70> systemctl start tomcat8
せ70> ll $CATALINA_HOME/work/Catalina/localhost/jsp10
合計 0
drwxr-x--- 3 tomcat tomcat 20 8月 11 18:07 org
→SESSION.serなし
(3) tomcatサービスの再起動前後
・ブラウザからtomcatはじめの7歩 セッション機能の活用で作成した下記の「session.jsp」にアクセスすることでセッションの保持と永続化について調べる
http://192.168.2.70:8080/jsp10/day02/session.jsp
最初のアクセス
・tomcatサービスを再起動
せ70> systemctl restart tomcat8
・同じブラウザから「F5」
→セッションは保持されていた
・tomcatサービスをもう一度再起動
せ70> systemctl restart tomcat8
・同じブラウザから「ctrl + F5」
→セッションは保持されていた
(4) システムリブート前後
・システムをリブート
せ70> systemctl reboot
・同じブラウザから「ctrl + F5」
→セッションは保持されていた
・もう一度システムをリブート
せ70> systemctl reboot
・同じブラウザから「F5」
→セッションは保持されていた
(5) tomcatサービスをSIGKILLで殺してtomcatを起動した後
・tomcatサービスをSIGKILLで殺す
せ70> kill -9 `cat $CATALINA_HOME/tomcat.pid`
・tomcatを起動
せ70> systemctl start tomcat8
・同じブラウザから「ctrl + F5」
→セッションは保持されなかった
・tomcatサービスをSIGKILLで殺す
せ70> kill -9 `cat $CATALINA_HOME/tomcat.pid`
・tomcatを起動
せ70> systemctl start tomcat8
・同じブラウザから「F5」
→セッションは保持されなかった
tomcatを正常終了したらsessionは保持されたが、tomcatをSIGKILLで異常終了したらsessionは保持されなかった。
【課題】上記からtomcat8のsessionはファイルでなくtomcatのメモリに保持されていると予想されるが間違いないか?
2.context.xmlの<Manager pathname="" />の注釈を外した場合
(1) context.xml
せ70> cat $CATALINA_HOME/conf/context.xml
<?xml version="1.0" encoding="UTF-8"?>
---(略)---
<Context>
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<Manager pathname="" />
</Context>
(2) SESSION.serファイル
せ70> systemctl start tomcat8
せ70> ll $CATALINA_HOME/work/Catalina/localhost/jsp10
合計 0
drwxr-x--- 3 tomcat tomcat 20 8月 11 22:31 org
→SESSION.serなし
(3) tomcatサービスの再起動前後
・ブラウザから http://192.168.2.70:8080/jsp10/day02/session.jsp にアクセス
初回アクセス
・「F5」を2回押下
・tomcatサービスを再起動
せ70> systemctl restart tomcat8
・同じブラウザから「F5」
→セッションは保持されなかった
・「F5」を2回押下してtomcatサービスを再起動
せ70> systemctl restart tomcat8
・同じブラウザから「ctrl + F5」
→セッションは保持されなかった
(4) システムリブート前後
・「F5」を2回押下
・システムをリブート
せ70> systemctl reboot
・同じブラウザから「ctrl + F5」
→セッションは保持されなかった
・もう一度システムをリブート
せ70> systemctl reboot
・同じブラウザから「F5」
→セッションは保持されなかった
(5) tomcatサービスをSIGKILLで殺してtomcatを起動した後
→セッションは保持されなかった
【分かったこと】
・context.xmlがデフォルトの場合、tomcatを正常終了したらsessionは保持されるが、tomcatをSIGKILLで異常終了したらsessionは保持されない。
・context.xmlの<Manager pathname="" />の注釈を外すとtomcatを正常終了した際にセッションが保持されなくなった。
【課題】 session永続化設定は下記のようにすればいいらしいが検証する
context.xmlで<Manager pathname="foo.ser" />と書くことにより、
$CATALINA_HOME/work/Catalina/ホスト名/コンテキスト名/foo.ser
という永続化ファイルが生成されるらしい。
(参照:Tomcat のセッション永続化について)
【課題】
session永続化設定(RDBに保存)
【課題】
session永続化設定(memcachedなどのKVSに保存)
【疑問】
tomcat8ではsession情報をメモリに保持し、「$CATALINA_HOME/work/Catalina/ホスト名/コンテキスト名/SESSION.ser」ファイルにレプリケーション?することもできるが、tomcatを負荷分散クラスタやHAクラスタのメンバーにする場合、セッションのレプリケーションはどう設定するのか? ※tomcatのメモリ上?のsession情報をローカルファイルに同期(もしくはsessionそのものとして使う?)して、このファイルを他のクラスタメンバーにレプリケーションする方法
【課題】tomcatのsession情報を共有データ(共有ファイル、RDB、KVSなど)に書き込んで、他のクラスタメンバーからread/writeする方法 ※排他制御はどうやるの?
■sessionの適用範囲
1.クライアント
※異なる種類のブラウザとは例えば(IEとChromeとかFirefoxとかが違うって意味)
・異なる種類のブラウザからのリクエスト→異なるsessionと見なされた。
・同じ種類ブラウザの異なるタブからのリクエスト→同じsessionと見なされた。
・同じ種類のブラウザの異なるwindowからのリクエスト→同じsessionと見なされた。
2.URL
レスポンスのSet-Cookieヘッダに下記のように「Path」属性でURLの適用範囲が指定される
JSESSIONID=9D792C0E70FFF09667B7598AEBFAA2EB; Path=/jsp10; HttpOnly
上記の場合、たとえば「http://192.168.2.70:8080/jsp10/day02/session.jsp」
のようにコンテキストルートが「/jsp10」へのリクエストの場合だけ同一sessionと見なされた。
(レスポンスにSet-Cookieヘッダで新規sessionIDが振り出されなかった)
たとえば「http://192.168.2.70:8080/chinko/20180714/sleep2.jsp」
のようにコンテキストルートが「/jsp10」以外へのリクエストの場合には「/jsp10のsession」とは異なるsessionと見なされた。
(レスポンスにSet-Cookieヘッダで新規sessionIDが振り出された)
【分かったこと】
同一種類のブラウザからのリクエストでも、異なるコンテキストへのリクエストはそれぞれ異なるsessionIDで扱われた。
■sessionの有効期限
1.sessionが終了する契機
・ブラウザを終了したとき
※sessionクッキーは(原則)メモリ上にしかないため揮発しちゃう
※同じ種類のブラウザのタブ、windowをすべて終了しないとsessionは保持され続けた
・サーバ上でsessionタイムアウトになったとき
・ブラウザに保存されているsession cookieが有効期限に達したとき
2.有効期限の設定
Set-Cookieヘッダでsession cookieを付与する際に、Expires または Max-Age で指定する
■sessionタイムアウト
・Webコンテナの設定
$CATALINA_HOME/conf/web.xml
・Webコンテキストの設定
$CATALINA_HOME/webapps/コンテキスト名/WEB-INF/web.xml
どちらの場合も、下記の赤字部分の時間を分単位で指定する
<session-config>
<session-timeout>30</session-timeout>
</session-config>
【検証】
・$CATALINA_HOME/conf/web.xmlのsession-timeoutを「1」に指定したら、sessionタイムアウトが1分になった。
→直近のリクエストから1分以上経過してから再度リクエストした場合、サーバからSet-Cookieヘッダに新しいsessionIDが付与されてレスポンスされた。
・$CATALINA_HOME/conf/web.xmlのsession-timeoutを「1」に指定して、
$CATALINA_HOME/webapps/コンテキスト名/WEB-INF/web.xmlのsession-timeoutを「2」に指定したら、sessionタイムアウトが2分になった。
→直近のリクエストから1分30秒経過してから再度リクエストした場合、sessionが保持されていた。直近のリクエストから2分以上経過してから再度リクエストした場合、サーバからSet-Cookieヘッダに新しいsessionIDが付与されてレスポンスされた。
【わかったこと】
・Webコンテナの設定は、$CATALINA_HOME/conf/web.xmlで行い、
Webコンテキストの設定は、$CATALINA_HOME/webapps/コンテキスト名/WEB-INF/web.xmlで行う。
・いずれの設定ファイルでも、<web-app>タグ配下の第一階層に、
<session-config>
<session-timeout>タイムアウト時間(分)</session-timeout>
</session-config>
のタグで設定する。
・Webコンテナの設定とWebコンテキストの設定が両方ともあった場合は、Webコンテキストの設定がWebコンテナの設定をオーバーライドする。
