Javaのセッション

セッションとは

あるショッピングサイトを見て回るとき、ページ遷移を繰り返してもショッピングカートの中身を保存しておくような仕組み。

しかし、これはあくまで説明のための例であり、セッション管理の主たる機能は認証機能にある。

セッションでログイン情報を管理することで、ユーザーのブラウザとアプリ間の通信であることが担保できる。逆にセッションによる認証が無ければ、POSTMANなどのクラックで、単純にURLだけ送信できればアクセスできてしまう。

セッションの特徴

  • セッションはサーバーで生成され、サーバー内に保存される
  • java servletのHttpSessionを使用することが多い
    ┗この場合のデフォルトのタイムアウト時間は30分
  • セッション情報IDはサーブレットで作成されるランダムな32桁の文字列で、JSESSIONIDとしてCookieに書き込まれる
  • 画面からセッションに格納されるデータを直接閲覧することはでき無いため、Cookieと比べ安全である
  • セッションIDの有効期間が切れるタイミングは、ブラウザを閉じた、または、セッションで指定した時間を経過した場合である
  • サーバーが異なればセッションも異なるため、 複数アプリケーション間でのセッションの共有は無い
  • HttpServletのgetRequest()によって作成される。※メソッド名だけ見ると、既存のセッションを取得しているように見えるが、このメソッドによって、セッションが存在しない場合は新規で作成される。

セッションの実装

セッションの作成

/session/SessionData.java // セッションを保存するDTO。ファイル名は任意。

@Component
@SessionScope
public class SessionData implements Serializable { //クラス名任意
  private SampleData sampleData;
  // コンストラクター・ゲッター・セッターは省略
}

@SessionScope は以下と同義

@Scope (value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)

参考:アノテーションインターフェース Scope

セッションの設定

以下のようなメソッドをSessionFilter.javaなどに記載 (Filterの話は前提知識として必要)

private void sample(HttpServletRequest request) {
  SessionData data = (SessionData) request.getSession().getAttribute("scopedTarget.sessionData");
  // scopedTarget.で作成したクラス名の頭文字小文字にしたもの
  // getSession() によって、セッションがあれば取得、なければ作成される
  // HttpServletRequest から得られるセッションはHttpSessionなので、作成しておいたセッションの型にキャストする
}

セッションの呼び出し

あとはサービスなりコントローラーなりで引数に指定すれば呼び出せる

@Service
public class CompNameServiceImpl {
  /** セッション。 */
  private final Session Data sessionData;
  public CompName Service Impl(SessionData sessionData) {
    this.sessionData = sessionData;
    var param = this.sessionData.getParam();
  }
}

値の設定

this.sessionData.setParam(param);

値が設定されない

sessionDataはeclipseでデバッグしても値がnullになっている。が、実は値は設定されていて、setXxx()で取り出せる。デバッグ方法は不明。

また、Serviceで設定したthis.sessionData.setParam (param) を、同じトランザクション内で呼びだした別のサービスでthis.sessionData.getXxx()しても取り出せないことがあった。

Service ではなく Controllerで先に setParamしたら上手く動作した。 Session の更新タイミングに少し癖があるかもしれない。

Appendix

Cookieとセッションの用途違い

  • Cookieはクライアントサイドでの情報保存に利用され、セッションはサーバーサイドでの接続情報を管理する。
  • セッションのIDはCookieに保存される
  • セッション内部の情報は、ブラウザはもちろん、APIのログにsyつりょくすることも稀なので、Cookieと比べるとセキュア。(もともと認証情報の保存が主たる用途なので当然だが)

 

コメント

タイトルとURLをコピーしました