CookieSessionFilter 0.0.1をリリースしました

HttpSessionの情報をクライアントのクッキーに保存するためのCookieSessionFilter 0.0.1をリリースしました。

セッション情報をクッキーに保存することで、セッションのレプリケーションを考える必要がなくなるのでフロントをスケールしやすくなりますし、どのノードを落としても関係ないので運用時のメンテナンスもしやすくなるはずです。

特徴

CookieSessionFilterには以下のような特徴があります。

  • フィルタでHttpSessionを差し替えているため、アプリケーションからは通常のHttpSessionと同じように使用することができます。クッキーセッションであることを意識する必要はありません。
  • セッション情報を暗号化してクッキーに保存します。暗号化処理はデフォルト実装としてBlowfishを使用するものを提供していますが、プラガブルになっているので別の実装に差し替えることが可能です。
  • クッキーのサイズが指定サイズをこえる場合は自動的に複数のクッキーに分割します。分割サイズや最大クッキー数は設定で指定することができます。

使い方

JARファイルはいまのところAmaterasのMavenリポジトリにしかありません。Mavenを使わない場合はMavenリポジトリからJARファイルをダウンロードしてください(その場合はJSONICとCommons Codecも別途入手する必要があります)。

<repositories>
  <repository>
    <id>amateras</id>
    <name>Project Amateras Maven2 Repository</name>
    <url>http://amateras.sourceforge.jp/mvn/</url>
  </repository>
</repositories>

<dependencies>
  <dependency>
    <groupId>jp.sf.amateras.cookiesession</groupId>
    <artifactId>cookie-session-filter</artifactId>
    <version>0.0.1</version>
  </dependency>
</dependencies>

web.xmlに以下のような感じでCookieSessionFilterを追加します。初期化パラメータのkeyはクッキーに入れるセッション情報をBlowfishで暗号化するためのキーなので、適切な値を設定してください。

<filter>
  <filter-name>cookieSessionFilter</filter-name>
  <filter-class>jp.sf.amateras.sessioncookiefilter.CookieSessionFilter</filter-class>
  <init-param>
    <param-name>chiper</param-name>
    <param-value>jp.sf.amateras.sessioncookiefilter.chiper.BlowfishCipher</param-value>
  </init-param>
  <init-param>
    <param-name>key</param-name>
    <param-value>1234</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>cookieSessionFilter</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>REQUEST</dispatcher>
</filter-mapping>

そうするとフィルタでHttpServletRequestがラッパーに差し替えられ、HttpSessionにsetAttribute()された値がクッキーに書き出されるようになります。

今後の課題

現時点では以下のような機能が未実装です。今後実装していきたいと思っています。

  • セッションタイムアウト(いまはブラウザを閉じるまではずっと有効)
  • レスポンスがflushされた場合の対策(いまはフィルタの出口でクッキーを書いているので先にflushされるとセッション情報の更新に失敗する)
  • クッキーのパスの指定(いまはパスを指定していないので同一ドメインであれば常に送信してしまう)
  • HttpSessionのメソッドで実装していないものがいくつかある(HttpSession#getId()とか)