セッションとは
あるショッピングサイトを見て回るとき、ページ遷移を繰り返してもショッピングカートの中身を保存しておくような仕組み。
しかし、これはあくまで説明のための例であり、セッション管理の主たる機能は認証機能にある。
セッションでログイン情報を管理することで、ユーザーのブラウザとアプリ間の通信であることが担保できる。逆にセッションによる認証が無ければ、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)
セッションの設定
以下のようなメソッドを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と比べるとセキュア。(もともと認証情報の保存が主たる用途なので当然だが)
コメント