サブゼミ セッション 管理 - CreW 慶應義塾大学

利用者を識別するWebアプリ
を作ろう!
2004年6月10日
武田林太郎
CreW
Creative Workspace
今日の目標
Webアプリでセッション管理を利用できるようにな
る
ステートレスとステートフルについて説明できるように
なる
セッションとは何かを説明できるようになる
サーブレットによるセッション管理ができるようになる
CreW
Creative Workspace
今日の内容
題材:「サブゼミ疑問解決掲示板~会員版~」
実習:
掲示板にセッション管理を使った機能を追加する
CreW
Creative Workspace
「サブゼミ疑問解決掲示板」って何だっけ?
コンセプト
授業外で生じた疑問をみんなで共有・解決し
授業の理解を深めて、よりよいサブゼミにする
ユーザができること
投稿する(投稿する疑問を解決したい)
授業外で生じた疑問を質問として掲示板に投稿。
投稿者の疑問を解決できると思う人が回答を投稿
する。
閲覧する(質問と回答をみんなで共有して理解を深め
たい)
CreW
Creative Workspace
今週の追加要求
投稿項目で同じものを,毎回入力するのは面倒
なので,どうにかして欲しい
研究会以外の人が投稿できないようにして欲し
い
CreW
Creative Workspace
要求その1
「連続投稿するとき何度も同じ情報を入力
するのは面倒くさい.」
入室してからは,「タイト
ル」と「内容」だけを入力し
たい
CreW
Creative Workspace
要求その2
「おかしな投稿がされないために、研究会
の人だけ使えるようにしてほしい。」
→会員制(ログインする)
CreW
Creative Workspace
今回の仕様
トップ画面で入力したパス
ワード(全員共通)でログイン
認証できた人だけが利用でき
る
トップ画面でユーザの情報も
入力してもらう。
Webアプリ利用中は再びユー
ザの情報を入力することはな
い。
CreW
Creative Workspace
※エラーページ割愛
画面遷移
トップ画面
LoginServlet
投稿画面
ToukouServlet
一覧閲覧画面
IchiranServlet
CreW
Creative Workspace
→デモ
要求を満たすためには
「投稿項目で同じものを,毎回入力するのは面
倒」に対してはどう解決したら良いでしょうか?
CreW
Creative Workspace
今日のWebアプリは
“利用者を識別する”必要がある
ユーザ:杉浦君がログインすると…
Webアプリはユーザを杉浦君としてサービスを
提供してくれる
投稿時に杉浦君のユーザ情報を付加してくれる
ログイン済みのユーザと見てなす
ユーザ:武田君がログインすると…
Webアプリはユーザに武田君としてのサービス
をしてくれる
CreW
Creative Workspace
利用者を識別するための問題点(1)
問)HTTPの特徴って何だっけ?
●クライアント(ブラウザ)とサーバとのやり取り
(データ交換)は…
リクエスト
と
とで成り立つ。
レスポンス
GETメソッドとPOSTメソッドがあった。
●1回やり取りした後に
接続は 維持・切断 される。
CreW
Creative Workspace
利用者を識別するための問題点(2)
●リクエスト/レスポンスごとに接続と切断が繰り返
される。
)
ザ
接続
レスポンス
リクエスト
Web
(
ク
ラ
ブ イ
ラ ア
ウ ン
ト
サ
ー
バ
●HTTPでは、
今回のリクエストと前のリクエスト/レスポンスとの関連がない.や
りとりが1回1回切断されていて、独立していることを.ステー
トレスと言う.
CreW
Creative Workspace
利用者を識別するための問題点(3)
このままだとサーバは,ログインした杉浦
君が2度目にリクエストしても、杉浦君だと
特定できない。
CreW
Creative Workspace
解決編(1)
利用者を識別するためには,「今回のリクエスト」と「前の
リクエスト/レスポンス」とが関連している必要がある
やりとりが1回1回は切断されず、連続した状態であること
をステートフルと言う.
例)SMTP…クライアントが明示的に切断しない限り、
何度でもリクエスト/レスポンスを繰り返せる。
CreW
Creative Workspace
ステートフルな通信の例:SMTP
%telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 nautilus.crew.sfc.keio.ac.jp ESMTP
HELO
250 nautilus.crew.sfc.keio.ac.jp
MAIL FROM: 差出人メールアドレス
250 ok
RCPT TO: 宛先メールアドレス
250 ok
DATA
354 go ahead
(本文)
.
250 ok 1022650055 qp 17435
QUIT
221 nautilus.crew.sfc.keio.ac.jp
Connection closed by foreign host.
%
赤文字:自分で入力
黒文字:ホストが出力
明示的に切断要求
CreW
Creative Workspace
解決編(2)
ステートフルにするためにはセッションを管理する必要が
ある
セッションとは,1人の利用者がWebアプリのサービスを利
用開始してから終了するまでの一連のやり取り
例)今回はログインしてから投稿や閲覧をしログアウトするまで
)
ザ
一
連
の
や
り
取
り
Web
(
ク
ラ
ブ イ
ラ ア
ウ ン
ト
サ
ー
バ
CreW
Creative Workspace
セッション管理を実現するには?
ユーザ(のブラウザ)を識別する
ユーザの情報を保管する
ユーザ(のブラウザ)とユーザの情報を結びつける
問)どうやって、ユーザ(のブラウザ)を識別するか?
問)どこに、ユーザ情報を保管するか?
ブラウザ・サーバ・リクエスト/レスポンス?
問)どうやって、ユーザ(のブラウザ)とユーザ情報を結びつけるか?
CreW
Creative Workspace
セッション管理の実際(1)
クライアント
(ブラウザ)
初回のリクエスト サーバ
パスワードOK!
暗証番号をつくって
岸君の
ユーザ情報と
結びつけて保管
して…
ログインします。
パスワード=CreW
ログイン名=t00289kk
名前=岸 健司……
岸君
OK。
暗証番号
次から
を
ABC
持ってきてね!
レスポンス
暗証番号
ABC
ユーザ情報
t00289kk
岸 健司
環境情報学部
4年
CreW
Creative Workspace
セッション管理の実際(2)
リクエスト
クライアント
(ブラウザ)
暗証番号
ABC
岸君
投稿します。
暗証番号
ABC
です。
タイトル=
“web.xmlの冒頭…”
内容=
“気になったので…”
OK。
レスポンス
サーバ
暗証番号
ABC
おや,さっき来
たABCさんだ。
ユーザ情報を
使って投稿
しておこう…
ユーザ情報
t00289kk
岸 健司
環境情報学部
4年
CreW
Creative Workspace
セッション管理の実際(3)
クライアント
(ブラウザ)
初回のリクエスト サーバ
ログインします。
パスワード=password
ログイン名=manabu
名前=杉浦 学……
杉浦君
パスワードOK!
番号札をつくって
杉浦君の
ユーザ情報と
結びつけて…
OK。
暗証番号
次から
を
DEF
持ってきてね!
レスポンス
暗証番号
DEF
暗証番号
ABC
ユーザの情報
manabu
杉浦 学
政策・メディア修士
1年
ユーザ情報
t00289kk
岸 健司
環境情報学部
4年
CreW
Creative Workspace
セッション管理の利用例
オンラインショッピングのカートシステム
杉浦君が大根をカートに入れると、清算の
までその情報が維持されている。
複数のページにまたがった操作をしても、ちゃ
んとその間の情報は維持される。
大根を買う杉浦君とにんじんを買う岸君は
区別される
CreW
Creative Workspace
サーブレットでセッション管理を実現するには
サーブレットではHttpSessionクラスによって,セッ
ション管理を行います
HttpSessionがやってくれること
セッションID(暗証番号)の発行
セッションIDの受け渡し
セッションに結びつけた情報管理
セッションの破棄
CreW
Creative Workspace
セッションの裏方:Cookieって?
ブラウザ側にちょっとした情報を維持しても
らう仕組み
サーバがブラウザに小さなテキスト情報
=Cookeiを送る(ユーザ側のHDD等に保存)
その後同じサイトを訪れたときに、ブラウザは
情報を付加してサーバにリクエストする。
Cookieの例→
HttpSessionが
ブラウザに
送ったCookie
CreW
Creative Workspace
HttpSessionの使い方(操作概要)
1.HttpSessionオブジェクトの生成(取得)
2.HttpSessionオブジェクトに情報を結びつける
3.HttpSessionオブジェクトに結びついた情報を取得
する
4.HttpSessionオブジェクトを無効にする
CreW
Creative Workspace
セッションオブジェクト生成/取得
HttpSession session = request.getSession ( true );
「まだセッションオブジェクトがないなら、生成してね」という設
定をする.
このユーザのセッション管理が開始してないなら
セッション管理を開始するということ.
CreW
Creative Workspace
セッションにユーザ情報を結びつける
オブジェクトを保管しなさい
session. setAttribute(“contributor”,contributor);
sessionオブジェクト(岸君用)
キー
"name"
値
岸健司
キーになるStirng
(保管オブジェクトの名札)
保管してもらうオブジェクト
String contributor=“岸 健司”;
CreW
Creative Workspace
セッションには情報を複数結びつけられる
session.setAttribute(“login”,login);
session.setAttribute(“department”,department);
session.setAttribute(“grade”,grade);
※セットできるのはオブジェクト。
自分で作ったものも可能。
intはオブジェクトでないので
そのままでは入れられません。
CreW
Creative Workspace
セッション管理中か確認する
HttpSession session = request.getSession ( false );
まだセッションオブジェクトがないなら、null(空っぽ)を返す
if(session == null){
【ログイン中でないときの処理】
}
CreW
Creative Workspace
セッションから情報を取り出す
String contributor = (String)session.getAttribute( "contributor" );
CreW
Creative Workspace
セッションの無効化
強制的に無効化する
session.invalidate();
タイムアウト
一定時間以上アクセスのないアイドル状態で無
効化する
session.setMaxInactiveInterval(秒数);
で変更可能。
※ブラウザを一旦終了すると、以前のセッションが使えなくな
ります。
CreW
Creative Workspace
セッション無効化の必要性
セキュリティ問題
セッションIDは厳重な秘密IDではないので、誰
かが入手して悪用するかもしれない。
必要最低限の時間で無効化するべき!!
→ログアウトやタイムアウトが必要
CreW
Creative Workspace
HttpSessionの主な使い方まとめ
あるユーザに対して、
セッションの生成
HttpSession session=request.getSession(true);
セッション( HttpSessionオブジェクト)に情報を結びつける
session.setAttribute(キーString,オブジェクト);
セッション( HttpSessionオブジェクト)に結びついた情報を取得
する
HttpSession session=request.getSession(false);
session.getAttribute(キーString);
セッション( HttpSessionオブジェクト)を無効にする
session. invalidate();
CreW
Creative Workspace
では、実習です
題材のプログラムを参考に…
セッション管理を利用した機能を自分の掲示板に
追加してください。
基本的には、「会員制にしてみる」
どうしても嫌な人は…相談。自分で考えてみる。例えば
本日の投稿回数を投稿を受け付けたときに表示する
(Integerクラスの利用…)
2度目以降の投稿で、1度目に入力した名前などの情
報が自動的に入力される
(toukou.html→ToukouInputServlet.javaに…)
など。
CreW
Creative Workspace
予備
ステートフルを可能にする例
特徴
情報保管場
所
ブラウザの
識別方法
実現する仕
組み
長期/小さな情報
大きな情報も扱いやすい
Cookie
サーブレット
Cookieクラス
からの利用
管理大変
サーバ
ブラウザ
×
特定利用者向け
ページ
セッションID
×
formの
Cookie URL書換 hidden
フィールド
HttpSession
IPアドレ
ス
formの
hidden
フィールド
HttpRequest
今日は赤字のところだけわかればOK.
CreW
Creative Workspace