
nablarch.common.web.session.store.HiddenStore Maven / Gradle / Ivy
The newest version!
package nablarch.common.web.session.store;
import nablarch.common.encryption.AesEncryptor;
import nablarch.common.encryption.Encryptor;
import nablarch.common.web.session.EncodeException;
import nablarch.common.web.session.SessionEntry;
import nablarch.common.web.session.SessionStore;
import nablarch.core.util.FileUtil;
import nablarch.fw.ExecutionContext;
import nablarch.fw.web.servlet.ServletExecutionContext;
import jakarta.xml.bind.DatatypeConverter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.List;
/**
* HTMLのinputタグ(type="hidden")を格納先とする{@link SessionStore}拡張クラス。
* 5u13以前のHiddenStoreクラスに以下の追加変更を行っている。
*
*
保存するデータをひとつづつ暗号化するのではなく、保存するデータ全体をまとめて暗号化する
* 保存するデータにセッションIDを含めておき、復元時のセッションIDと一致することを確認する
*
* 5u13以前のHiddenStoreクラスとは直列化、暗号化の方法など
* 内部的な処理やデータ構造は異なるが、外部的な振る舞いは互換性がある。
*
* デフォルトのストア名は"hidden"である。
*
* 以下の構造でデータをストアに格納する。
* * | 項目 | 長さ | * |--------------------------------------------------+-------| * | セッションIDバイト長 | 4Byte | * | セッションID | 可変 | * | セッションエントリ({@link SessionEntry}のリスト) | 可変 | ** * 保存({@link #save(String, List, ExecutionContext)}時にセッションIDを格納しておき、 * 復元({@link #load(String, ExecutionContext)})時にセッションIDが一致することを確認する。 * これにより、他ユーザのデータを流用することを防止する。 * * 復元時点でセッションタイムアウトが発生している場合は、 * 復元処理がスキップされるため({@link #save(String, List, ExecutionContext)} save}が呼ばれない) * セッションIDの変更が改ざんに誤検知されることはない。 * * @author TIS */ public class HiddenStore extends SessionStore { /** セッションIDのエンコーディングに使用する{@link Charset} */ private static final Charset SESSION_ID_ENCODING = Charset.forName("UTF-8"); /** 「セッションIDバイト長」領域のバイト長(4Byte) */ private static final int SESSION_ID_LENGTH_BYTES = Integer.SIZE / Byte.SIZE; /** 暗号化クラス */ @SuppressWarnings("rawtypes") private Encryptor encryptor; /** 暗号化のコンテキスト */ private Serializable context; /** セッション内容を書きだすhidden要素のname属性(=POSTパラメータ名) */ private String parameterName = ExecutionContext.FW_PREFIX + "hiddenStore"; /** * コンストラクタ。 */ public HiddenStore() { super("hidden"); @SuppressWarnings("rawtypes") Encryptor defaultEncryptor = new AesEncryptor(); setEncryptor(defaultEncryptor); } /** * HiddenStoreのロードに失敗した場合に送出する例外。 * @author Kiyohito Itoh */ public static class HiddenStoreLoadFailedException extends EncodeException { /** * コンストラクタ。 * @param cause 起因例外 */ public HiddenStoreLoadFailedException(Exception cause) { super(cause); } } /** * {@inheritDoc} * 本クラスでは、セッションIDとセッションエントリ全体を暗号化した結果を保存する。 */ @Override public void save(String sessionId, List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy