利用者を識別する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
© Copyright 2024 ExpyDoc