研究クッキーの後に、要求を送信することなくデータ共有の問題を解決します。クッキーは、ブラウザ側のデータストレージ技術で、このレッスンは、重要な追加のデータ・ストレージ・テクノロジー、セッション技術に焦点を当てています。
セッションの学習
問題:
別のサーブレットの最初のリクエスト内のデータ共有の問題を解決するための要求オブジェクトは、ユーザーがどのようにそれを行うには、同じデータを使用する必要が異なる要求に対処しますか?
ソリューション:
使用するセッション技術を。
原理:
最初のユーザは、ブラウザは、サーバが要求を受信した後、対応する起動サーバに要求を送信し使用するサーブレット処理。ユーザを処理するユーザ要求に関連する一般的なデータ処理を格納するために使用されるセッション・オブジェクトを作成し、セッションJSESSIONIDクッキーに、このオブジェクトは、ブラウザに(一時的に記憶、ブラウザすなわち、故障が閉じている)記憶されます。ユーザが第2の要求と次の要求を開始するとき、要求メッセージはJSESSIONID、要求を受信するサーバ、対応するサーブレット呼び出し要求処理に含まれ、そしてJSESSIONIDに基づいて対応するセッションオブジェクトを返すであろう。
特徴:
セッションCookieの最新技術は、サーバ側のデータストレージ技術に依存しています。
サーバーによって作成されました
各ユーザーは別々の持っているセッションを
デフォルトの保存時間は、 30分の役割:
ユーザーのさまざまなデータ共有要求の問題を解決します。
使用します。
作成 Sessionオブジェクト
格納されたデータセッションオブジェクト取得セッションオブジェクト
以下からのデータの取得セッションオブジェクトを
取得した場合は、データセッションはnullを返しますが存在しません。
注意:
彼らは、ブラウザを閉じていない、とのセッションの場合には失敗しない、任意のサーブレットプロジェクトで取得された要求を持つすべてのユーザーが同じセッションオブジェクトです。
スコープ: 会話
サーブレットのセッション
HTTPは、クライアントのページを取得するたびに意味「ステートレス」プロトコルであり、クライアントがWebサーバーへの個別の接続を開き、サーバーは自動的に前にクライアントの要求への記録を保持しないでしょう。
維持するには、3つの方法 WebクライアントとWebサーバー間のセッションの会話を
1、クッキー
2、非表示のフォームフィールド
3、URLリライト
HttpSessionオブジェクト
上記3つの方法に加えて、サーブレットは、ユーザ、ユーザを識別し、ページ要求するとき、クロスモード又は訪問複数の情報を記憶する提供のHttpSessionインターフェースを提供します。
HTTPクライアントとHTTPサーバ間のセッションの会話を作成するには、このインターフェイスを使用するには、サーブレットコンテナ。セッションが複数接続されているか、ページ要求間で、一定の期間を継続します。
呼び出すことにより、以下のように()、公共HttpSessionオブジェクトのHttpServletRequestメソッドのgetSessionを取得します:
HttpSessionのセッション=でrequest.getSession();
|
あなたがクライアントに任意のドキュメントコンテンツを送信する前に呼び出す必要がでrequest.getSession()。ここではいくつかの重要な方法の概要はで利用できるのHttpSessionオブジェクトです。
メソッドと説明
パブリックオブジェクトのgetAttribute(文字列名)
このメソッドは、返され、セッションでセッションの指定された名前を持つオブジェクトをオブジェクト名が指定されていない場合は、nullが返されます。
パブリック列挙getAttributeNames()
このメソッドは、返す Stringオブジェクト、セッションのセッションオブジェクトにバインドされたすべての名前を含むStringオブジェクトの列挙を。
公共長いgetCreationTime()
この方法は返しミリ秒単位で、セッションのセッションが作成された時、真夜中の自己GMT 1970年1月の日付を。
公共の文字列のgetId()
該方法は、割り当てに戻るセッションのセッションの一意の文字列識別子。
公共長いgetLastAccessedTime()
このメソッドは、クライアントが最後に送信し返すミリ秒単位で、真夜中のGMT 1970年1月日からのセッションのセッション関連の要求時間を。
公共int型getMaxInactiveInterval()
このメソッドは返し秒で、クライアントアクセスの最大時間間隔セッションオープンセッションを保持しているサーブレットコンテナを。
公共ボイド無効()
これは、メソッドがあることを示し無効なセッションセッションであり、それ以上の任意のオブジェクトにバインドされた解放します。
パブリックブールisNew()
クライアントが認識していない場合は、セッションのセッションを、または顧客が選択した場合にセッションにセッションに参加しない場合、メソッドはtrueを返します。
ます。public void removeAttribute(文字列名)
以下からのメソッド指定されたオブジェクトのセッションの名前を削除するセッション。
公共ボイドのsetAttribute(文字列名、オブジェクト値)
このメソッドはにオブジェクトをバインドするために、指定された名前を使用してセッションセッション。
ます。public void setMaxInactiveInterval(int型の間隔)
プロセス内のセッションは秒単位で無効なセッションサーブレットコンテナ、指定されたクライアント要求の間の時間、であることを示しているの前に。
削除セッションのセッションデータを
1は、特定の属性を削除するには:あなたが呼び出すことができるキーに関連付けられた特定の値を削除するには、公共のボイドremoveAttribute(String name)メソッドを。
2、全体の削除セッションのセッションを:あなたは、セッションにセッション全体を廃棄する公共ボイド無効()メソッドを呼び出すことができます。
3、設定されたセッションのセッション有効期限を:あなたは別のセッションのセッションタイムアウトを設定するには、公共のボイドsetMaxInactiveInterval(int型の間隔)メソッドを呼び出すことができます。
web.xmlの設定
使用して次のようにTomcatを、上記の方法に加えて、あなたは、セッションタイムアウトのweb.xmlファイルでセッションを設定することができます。
<セッション-config>の <セッションタイムアウト> 15 </セッションタイムアウト> </セッション設定>
|
上記タイムアウト時間としては、例えば、被覆、分で 30分間、Tomcatのデフォルトのタイムアウト。
いずれかの()メソッドでgetMaxInactiveIntervalサーブレット秒で、セッションタイムアウトセッションを返します。したがって、15分のセッション設定のweb.xmlセッションタイムアウト時間は、次いでgetMaxInactiveInterval()900が返した場合。
パッケージcn.sxt。 インポートにjava.io.IOException; 輸入javax.servlet.ServletException; 輸入javax.servlet.annotation.WebServlet; 輸入javax.servlet.http.HttpServlet。 インポートのjavax.servlet.http.HttpServletRequest; インポートのjavax.servlet.http.HttpServletResponse; 輸入javax.servlet.http.HttpSession。 / ** *サーブレットの実装クラスlianxi2 * / @WebServlet( "/ lianxi2" ) のパブリック クラス lianxi2は拡張HttpServletを{ プライベート 静的 最終 長いですserialVersionUID = 1L 。 / ** * @see のHttpServlet#HttpServletを() * / 公共lianxi2(){ スーパー(); // TODO自動生成コンストラクタスタブ } / ** * @see のHttpServlet#のdoGet(HttpServletRequestのリクエスト、HttpServletResponseの応答) * / 保護された ボイドのdoGet(HttpServletRequestのリクエスト、HttpServletResponseの応答)がスローServletExceptionがは、IOException { // TODO自動生成方法スタブを 。response.getWriter()( "で提供してい:"を追加).append(request.getContextPath()); // Sessionオブジェクトを作成します。 HttpSessionのセッション= でrequest.getSession(); // セッションオブジェクトに格納したデータ(一時的に、空にした後、ブラウザを閉じて) にsession.setAttribute( "名前"、 "CXK" ); にsession.setAttribute( "年齢"、 "20" ); // ブラウザに対応して response.getWriter()のprintln( "SECC。" ); } / ** * @see のHttpServlet#のdoPost(HttpServletRequestのリクエストを、HttpServletResponseの応答) * / 保護された 空のdoPost(HttpServletRequestのリクエスト、HttpServletResponseの応答)がスローされますServletExceptionがは、IOException { // TODO自動生成方法スタブ のdoGet(リクエスト、レスポンス)。 } }
パッケージcn.sxt。 インポートにjava.io.IOException; 輸入javax.servlet.ServletException; 輸入javax.servlet.annotation.WebServlet; 輸入javax.servlet.http.HttpServlet。 インポートのjavax.servlet.http.HttpServletRequest; インポートのjavax.servlet.http.HttpServletResponse; 輸入javax.servlet.http.HttpSession。 / ** *サーブレットの実装クラスlianxi1 * / @WebServlet( "/ lianxi1" ) のパブリック クラス lianxi1は拡張HttpServletを{ プライベート 静的 最終 長いですserialVersionUID = 1L 。 / ** * @see のHttpServlet#HttpServletを() * / 公共lianxi1(){ スーパー(); // TODO自動生成コンストラクタスタブ } / ** * @see のHttpServlet#のdoGet(HttpServletRequestのリクエスト、HttpServletResponseの応答) * / 保護された ボイドのdoGet(HttpServletRequestのリクエスト、HttpServletResponseの応答)がスローServletExceptionがは、IOException { // TODO自動生成方法スタブを 。response.getWriter()( "で提供してい:"を追加).append(request.getContextPath()); // 同じブラウザ(同じユーザー)セッションオブジェクト のHttpSessionセッション= でrequest.getSessionを(); // このメソッドは、セッション・オブジェクトに指定された名前とのセッションを返す (response.getWriter ).println( "\ N-" + session.getAttribute( "名前")+ "\ N-" ); response.getWriter(。)のprintln( "\ N-" + session.getAttribute( "年齢")+ "\ N-" ); response.getWriter(。)のprintln( "\ N-" session.getCreationTime +()+ "\ N-" ); // このメソッドは、セッション文字列を含むセッションに割り当てられた固有の識別子を返します。 。response.getWriter()のprintln( "\ N-" session.getId +()+ "\ N-" ); 。response.getWriter()のprintln(「\ N-」session.getLastAccessedTime +()+「\ N-」); // クライアントアクセスサーブレットコンテナの保持方法は秒で、最大時間間隔セッションを開いているセッションを返します。 。 。response.getWriter()のprintln(+ session.getMaxInactiveInterval()+ "\ N-" "N-を\" ); // このメソッドは、オブジェクトの名前を指定するには、セッションのセッションを削除します。 session.removeAttribute(「年齢」); // このメソッドは、セッションの前にセッションは、秒単位のサーブレットコンテナへのクライアント要求の間で指定した時間無効であることを示しています。 session.setMaxInactiveInterval(10 ); //は、属性値に変更 にsession.setAttribute( "名前"、 "yCyを" ); 。response.getWriter()のprintln( "\ N-" + session.getAttribute( "名前" 。response.getWriter()のprintln("\ n"は+ session.getAttribute( "年齢")+ "\ nを" ); } / ** * @see のHttpServlet#のdoPost(HttpServletRequestのリクエスト、HttpServletResponseの応答) * / 保護された ボイドのdoPost(HttpServletRequestのリクエスト、HttpServletResponseの応答)スローServletExceptionがは、IOException { // TODO自動生成方法のスタブ のdoGet(要求、応答)。 } }