TomcatでSessionを使いたくない場合

Tomcat4系にて、Tomcat再起動時にSession情報はクリアされているのかと思いきや、実はファイルに保存して再読込していることが分かりました。

アプリケーション再起動時に保存されるセッション状態を記述したファイルがあります。
デフォルトでは workDir/SESSIONS.ser ですが、ここではそのファイル名およびパスを指定する事が出来ます。

Session使っていない場合、無駄なリソースを食っていると言えば食っているのでSessionを削除する方法について調べてみました。
1.Sessionを作らないようにする
JSPのディレクティブでsessionを利用するか選択できます。session=falseの設定をしておくと、sessionが作られません。
記述例:


<%@ page contentType="text/html; charset=Shift-JIS" session="false" %>


また、request.getSession(false)とすることにより、新たにSessionを作らなくなります。
Sessionがない場合、nullが返却されます。

2. 作ったSessionを毎回削除する
filter機能を使用して、リクエスト毎にSessionを削除するようにします。
なお、Filterをかませた場合、0.1秒前後遅くなりますので注意して下さい。
サンプルコード:

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
public class SessionDeleteFilter implements Filter {
private final Logger logger = Logger.getLogger(this.getClass().getName());
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(
final ServletRequest request,
final ServletResponse response,
final FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
final HttpServletRequest req = (HttpServletRequest) request;
// Sessionがあるかどうかチェックする
if(req.getSession(false) != null) {
log("Session情報を削除します");
try {
// Sessionがあった場合、削除する
req.getSession(false).invalidate();
log("Session情報削除しました");
}
// req.getSession(false)がnullの場合があったらエラーとなってしまう。
// Sessionが取得できない場合は無視
catch (final NullPointerException e) {
log("Session情報削除失敗しました");
}
}
else {
// Sessionがない場合、何もしない
log("Session情報がないので、何もしません");
}
}
public void destroy() {
}
private void log(final String msg) {
logger.log(Priority.INFO, msg);
}
}

コメント

このブログの人気の投稿

雁尾千恵(37)

ResultSet.next()の高速化