なんかな「同一セッションであるWEB業務システムがログイン画面以外を開いていないか知りたい」って要求がありましてな、技術検証とか詳細設計とかまったくないのね。
工程は製造フェーズ。
ちなASP.net。
いまさらそのような状況に腰を抜かすほど経験は浅くない。
とりままる一日悩んでみた。
結果、次の仕様を思いついた。
【仕様】10/04修正
① セッションに画面遷移のパンくずを保持する
② パンくずの属性は次の2つ
1.(整数)現在の画面ID
2.(整数)遷移前の画面ID
次の属性もあると良い(10/04)
3.(文字列)遷移前画面の完全なURL(10/04)
③ 現在の画面IDはHIDDEN属性(VIEWステート含む)にも保持する
④ 現在の画面IDは遷移前の画面IDより大きい
⑤ ポストバック時、ポストバックした画面の現在の画面IDは即時に最も大きい値に更新する
パンくずに存在するポストバックした画面の現在の画面IDも同様に全て更新する
⑥ 遷移前の画面はパンくずに存在する最大の現在の画面ID
⑦ 循環的に同一画面に遷移した場合、別な画面として現在の画面IDを払い出す
(前の画面に戻る処理も同じ) (10/04)
⑧ 前の画面に戻るときは現在の画面のパンくずと前の画面のパンくずを削除する。
前々の画面の画面IDを最も大きい値に更新する(10/04)
⑨ windows.unloadイベントもしくは明示的なログアウトを契機に現在の画面IDを始点とする一連のパンくずを削除する
⑩ パンくずが空の場合、同一セッションであるWEB業務システムがログイン画面以外を開いていないとする
以上です。
あ、以上じゃなくって。
画面IDはDateTime.Now.Ticksにしました。
遷移前の画面IDをURLパラメータにしようとしたかた、地雷踏み抜きます(1分脳内でパターン網羅すると判明するかと)。
⑧はiFrameにパンくず削除用の*.aspxをロードしてみました。
で、本題なのだが、これ、正常に動作しないケースを定義できる。
だから仕様として不完全です。
でも、なんか動いてるんよ。
正常に動作しないケースは定義できるが事実上発生し得ないと定義できればいいのだが…他のミッションが手に余っていて、理論武装ができないでいる。
本番リリースは来年なので、まだ時間はある。
小規模チームで考える手が私しかいないのが辛いが、なんとかメカニズムとして完成をさせたい。
今度こそ以上です。