品質は後付けできる例
1つのブラウザで、複数タブを使った場合、サーバー側では、同一セッションになる。
ということは、
・はじめ、ユーザー名xmldtpでログインしておき、
その後、新たなタブでウィリアムとログインしても、
同じセッションが使われる
・はじめ、ユーザー名xmldtpでログインしておき、
その後、新たなタブでxmldtp(と同名で)ログインした場合、
(1)先にログインしているからエラー
(2)後でログインしたものを優先し、セッションを作り直す
のどちらもできる。ただし、(2)でセッションを作り直した後に、
はじめ操作していたタブでアクセスすると(2)で新しいセッション
になっているのでおかしくなる可能性がある(場合によっては落ちる)
■お題
ここで、

xmldtpでログインすると、

のように、アクセス回数とセッションIDを返すプログラムで、
何回もxmldtpでアクセスして

のようになった状態で、

のように、新たなIDでログインすると

のように初期化され

と戻すと

のように前の値を持ってくることを考える
※上記のセッションIDを見ると、みんな同じ。つまり、値は変わっているが、
同一セッションを使いまわしている
■概要
Tomcat7で指定URLのみクッキーを無効に
http://questionbox.jp.msn.com/qa7881678.html
の「ANo.3」に書かれているとおり。つまり、
・Filterに、ハッシュマップをstaticで用意する(=全体で1個)、
→そのハッシュマップには、
キーはログイン名、値は保存したい値を持っておく
・FilterのdoFilterで、
パラメータから、ログイン名をチェック
上記ハッシュマップに値が入っていたら、その値をセッションに入れる
→ここで、ログイン名ごとに、セッションの値が入れ替わる
・セッションのリスナーで
セッションの値が書き換わったら、上記ハッシュマップの値も書き換え
・セッションが破棄されれたら、上記ハッシュマップのログイン名のデータも破棄
ということをする。
■お題に関係ない部分
お題に関係ない、はじめの画面は、こんな感じのJSP(index.jsp)
ここで、ログイン名を入れているので、上記フィルタにより、
noの値がログイン名ごとに入れ替えられ
結果表示のJSP(kekka.jsp)
にわたる。ここでnoに1足すと、リスナーが呼ばれる。
ここまでは、あまり今回のお題に関係ない
■セッションの値を入れ替える部分:フィルタ
フィルタの値を入れ替えるJavaプログラムMyFilter1.javaはこんなかんじ。
■値が書き換わったとき:リスナー
セッションの値が書き換わったら、セーブしてあるデータも書き換える
MyFilterListener1.javaはこんなかんじ
■web.xml
フィルターとリスナーをweb.xmlに登録する。こんな感じ
■つけたし
(A)以上でできるのだが、これを実行すると

のように、違うブラウザでも、ログイン名が同じだと、同じセッションデータ
を使ってしまう。これはこれでいいかもしれないが、いけない場合、
ログイン名のほかにセッションIDを足したものをキーとすればよい
(B)後がちにするには、保存しているデータに、ログイン時間を持ち、
サーバーアクセスする際には、ログイン名とログイン時間を常に
パラメータで渡す。ログイン名は一致するが、ログイン時間が一致
しない場合は、後からログインされたものとみなして、
すぐに終了処理をするなり、セッションにその旨の値を入れる
(C)ユーザーAがログインしたら、B,Cはキャンセルという場合、
ユーザーAがログインしたら、ハッシュマップのB,Cデータを
消せば、B,Cがアクセスしたとき、ログインデータをなくせる
(D)これは、排他制御はしていない。したがって、同時アクセスされるとおかしくなる。
排他制御をするなら、ハッシュマップの(上記のソースだとsvdataの)ログイン名と
値を直接変更し、その際排他制御をし・・・とかいうと、セッションそのものを
自作しているのと、なんらかわらない(^^;)
■いいたいこと
で、いいたいことは、このやりかたでなく、
ユーザーごとにログインしたいとか、(A),(B),(C)のバグ修正
をするとしても、基本的に1を足すというロジック部分は変わっていない
(変わっているのはセッション部分で、主にフィルターとリスナーの中)
つまり、ロジック部分を分離すれば、あとは入出力部分で品質は変えられる。
1つのブラウザで、複数タブを使った場合、サーバー側では、同一セッションになる。
ということは、
・はじめ、ユーザー名xmldtpでログインしておき、
その後、新たなタブでウィリアムとログインしても、
同じセッションが使われる
・はじめ、ユーザー名xmldtpでログインしておき、
その後、新たなタブでxmldtp(と同名で)ログインした場合、
(1)先にログインしているからエラー
(2)後でログインしたものを優先し、セッションを作り直す
のどちらもできる。ただし、(2)でセッションを作り直した後に、
はじめ操作していたタブでアクセスすると(2)で新しいセッション
になっているのでおかしくなる可能性がある(場合によっては落ちる)
■お題
ここで、

xmldtpでログインすると、

のように、アクセス回数とセッションIDを返すプログラムで、
何回もxmldtpでアクセスして

のようになった状態で、

のように、新たなIDでログインすると

のように初期化され

と戻すと

のように前の値を持ってくることを考える
※上記のセッションIDを見ると、みんな同じ。つまり、値は変わっているが、
同一セッションを使いまわしている
■概要
Tomcat7で指定URLのみクッキーを無効に
http://questionbox.jp.msn.com/qa7881678.html
の「ANo.3」に書かれているとおり。つまり、
・Filterに、ハッシュマップをstaticで用意する(=全体で1個)、
→そのハッシュマップには、
キーはログイン名、値は保存したい値を持っておく
・FilterのdoFilterで、
パラメータから、ログイン名をチェック
上記ハッシュマップに値が入っていたら、その値をセッションに入れる
→ここで、ログイン名ごとに、セッションの値が入れ替わる
・セッションのリスナーで
セッションの値が書き換わったら、上記ハッシュマップの値も書き換え
・セッションが破棄されれたら、上記ハッシュマップのログイン名のデータも破棄
ということをする。
■お題に関係ない部分
お題に関係ない、はじめの画面は、こんな感じのJSP(index.jsp)
<html> <head> <title>MySession</title> </head> <body> <form method="post" action="kekka.jsp"> login name<input type="text" name="loginName"/> <input type="submit"/> </form> </body> |
ここで、ログイン名を入れているので、上記フィルタにより、
noの値がログイン名ごとに入れ替えられ
結果表示のJSP(kekka.jsp)
|
にわたる。ここでnoに1足すと、リスナーが呼ばれる。
ここまでは、あまり今回のお題に関係ない
■セッションの値を入れ替える部分:フィルタ
フィルタの値を入れ替えるJavaプログラムMyFilter1.javaはこんなかんじ。
|
■値が書き換わったとき:リスナー
セッションの値が書き換わったら、セーブしてあるデータも書き換える
MyFilterListener1.javaはこんなかんじ
|
■web.xml
フィルターとリスナーをweb.xmlに登録する。こんな感じ
|
■つけたし
(A)以上でできるのだが、これを実行すると

のように、違うブラウザでも、ログイン名が同じだと、同じセッションデータ
を使ってしまう。これはこれでいいかもしれないが、いけない場合、
ログイン名のほかにセッションIDを足したものをキーとすればよい
(B)後がちにするには、保存しているデータに、ログイン時間を持ち、
サーバーアクセスする際には、ログイン名とログイン時間を常に
パラメータで渡す。ログイン名は一致するが、ログイン時間が一致
しない場合は、後からログインされたものとみなして、
すぐに終了処理をするなり、セッションにその旨の値を入れる
(C)ユーザーAがログインしたら、B,Cはキャンセルという場合、
ユーザーAがログインしたら、ハッシュマップのB,Cデータを
消せば、B,Cがアクセスしたとき、ログインデータをなくせる
(D)これは、排他制御はしていない。したがって、同時アクセスされるとおかしくなる。
排他制御をするなら、ハッシュマップの(上記のソースだとsvdataの)ログイン名と
値を直接変更し、その際排他制御をし・・・とかいうと、セッションそのものを
自作しているのと、なんらかわらない(^^;)
■いいたいこと
で、いいたいことは、このやりかたでなく、
ユーザーごとにログインしたいとか、(A),(B),(C)のバグ修正
をするとしても、基本的に1を足すというロジック部分は変わっていない
(変わっているのはセッション部分で、主にフィルターとリスナーの中)
つまり、ロジック部分を分離すれば、あとは入出力部分で品質は変えられる。