■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コンテナの設定をオーバーライドする。