サーブレットはどのように機能しますか?インスタンス化、セッション、共有変数、マルチスレッド

1171
Ku Jon 2010-06-24 14:16.

多数のサーブレットを保持するWebサーバーがあるとします。これらのサーブレット間で受け渡される情報については、セッション変数とインスタンス変数を設定しています。

ここで、2人以上のユーザーがこのサーバーにリクエストを送信すると、セッション変数はどうなりますか?
それらはすべてすべてのユーザーに共通ですか、それともユーザーごとに異なりますか?
それらが異なる場合、サーバーはどのようにして異なるユーザーを区別できましたか?

もう1つの同様の質問ですがn、特定のサーブレットにアクセスするユーザーがいる場合、このサーブレットは最初のユーザーが最初にアクセスしたときにのみインスタンス化されますか、それともすべてのユーザーに対して個別にインスタンス化されますか?
言い換えれば、インスタンス変数はどうなりますか?

7 answers

1852
BalusC 2010-06-24 16:41.

ServletContext

サーブレットコンテナ(Apache Tomcatなど)が起動すると、すべてのWebアプリケーションがデプロイおよびロードされます。Webアプリケーションがロードされると、サーブレットコンテナはServletContext1回作成し、サーバーのメモリに保持します。Webアプリケーションのweb.xmlと付属のすべてweb-fragment.xmlのファイルが解析され、各され<servlet><filter>そして<listener>見つかった(または注釈付きで、各クラス@WebServlet@WebFilterおよび@WebListenerそれぞれ)は一度インスタンス化だけでなく、サーバのメモリに保持されます。インスタンス化されたフィルターごとに、そのinit()メソッドはnewで呼び出されますFilterConfig

ときにServlet持っている<servlet><load-on-startup>@WebServlet(loadOnStartup)の値よりも大きい0、そのinit()方法は、また、新しいと起動時に呼び出されますServletConfig。これらのサーブレットは、その値で指定されたのと同じ順序で初期化されます(11番目、22番目など)。同じ値が複数のサーブレットのために指定されている場合、それらのサーブレットの各々は、それらが現れるのと同じ順序でロードされるweb.xmlweb-fragment.xmlまたは@WebServletクラスローディング。「load-on-startup」値がない場合init()、HTTPリクエストがそのサーブレットに初めてヒットするたびにメソッドが呼び出されます。

サーブレットコンテナが上記のすべての初期化手順を完了するServletContextListener#contextInitialized()と、が呼び出されます。

ダウンサーブレットコンテナの閉まりが、それはすべてのWebアプリケーションをアンロードすると、呼び出しdestroy()の初期化サーブレットとフィルタ、およびすべてのすべての方法をServletContextServletFilterおよびListenerインスタンスがゴミ箱に移動されています。最後に、ServletContextListener#contextDestroyed()が呼び出されます。

HttpServletRequestとHttpServletResponse

サーブレットコンテナは、特定のポート番号でHTTPリクエストをリッスンするWebサーバーに接続されています(ポート8080は通常、開発中に使用され、ポート80は本番環境で使用されます)。クライアント(Webブラウザ、または持つ例えば、ユーザ場合は、プログラムで使用してはURLConnection)HTTPリクエストを送信し、サーブレットコンテナは、新規作成HttpServletRequestHttpServletResponseオブジェクトと定義されているすべてのを介してそれらを通過しFilter、最終的には、チェーン内およびServletインスタンスを。

フィルタの場合、doFilter()メソッドが呼び出されます。サーブレットコンテナのコー​​ドがを呼び出すchain.doFilter(request, response)と、要求と応答は次のフィルタに進むか、フィルタが残っていない場合はサーブレットにヒットします。

サーブレットの場合、service()メソッドが呼び出されます。デフォルトでは、このメソッドは、にdoXxx()基づいて呼び出すメソッドを決定しますrequest.getMethod()。決定されたメソッドがサーブレットに存在しない場合、HTTP405エラーが応答で返されます。

リクエストオブジェクトは、URL、ヘッダー、クエリ文字列、本文など、HTTPリクエストに関するすべての情報へのアクセスを提供します。応答オブジェクトは、たとえば、ヘッダーと本文(通常はJSPファイルから生成されたHTMLコンテンツを使用)を設定できるようにすることで、HTTP応答を必要な方法で制御および送信する機能を提供します。HTTP応答がコミットされて終了すると、要求オブジェクトと応答オブジェクトの両方がリサイクルされ、再利用できるようになります。

HttpSession

クライアントが初めてWebアプリにHttpSessionアクセスしたとき、および/またはを介して初めて取得されたときrequest.getSession()、サーブレットコンテナは新しいHttpSessionオブジェクトを作成し、長くて一意のID(で取得できますsession.getId())を生成し、サーバーに保存します。メモリ。サーブレットコンテナはまた、セットCookieSet-CookieしたHTTPレスポンスのヘッダJSESSIONIDの名前とその値として一意のセッションIDとして。

HTTP cookie仕様(適切なWebブラウザーとWebサーバーが順守する必要のある契約)に従って、クライアント(Webブラウザー)はCookie、Cookieが有効である限り、ヘッダー内の後続の要求でこのCookieを送り返す必要があります(つまり、一意のIDは有効期限が切れていないセッションを参照している必要があり、ドメインとパスは正しいです)。ブラウザの組み込みHTTPトラフィックモニターを使用して、Cookieが有効であることを確認できます(Chrome / Firefox 23+ / IE9 +でF12を押し、[ネット/ネットワーク]タブを確認します)。サーブレットコンテナはCookie、すべての着信HTTPリクエストのヘッダーで、名前の付いたCookieの存在を確認し、JSESSIONIDその値(セッションID)を使用しHttpSessionてサーバーのメモリから関連付けを取得します。

HttpSession指定されたタイムアウト値<session-timeout>(の設定)を超えてアイドル状態になるまで(つまり、リクエストで使用されなくなるまで)存続しweb.xmlます。タイムアウト値のデフォルトは30分です。そのため、クライアントが指定された時間より長くWebアプリにアクセスしない場合、サーブレットコンテナはセッションを破棄します。後続のすべてのリクエストは、Cookieが指定されていても、同じセッションにアクセスできなくなります。サーブレットコンテナは新しいセッションを作成します。

クライアント側では、ブラウザインスタンスが実行されている限り、セッションCookieは存続します。したがって、クライアントがブラウザインスタンス(すべてのタブ/ウィンドウ)を閉じると、セッションはクライアント側で破棄されます。新しいブラウザインスタンスでは、セッションに関連付けられたCookieが存在しないため、送信されなくなります。これにより、まったくHttpSession新しいセッションCookieが使用され、まったく新しいものが作成されます。

一言で言えば

  • ServletContext長いWebアプリケーションの命と同じくらいのために命。これは、すべてのセッションのすべての要求で共有されます。
  • HttpSession限り、クライアントが同じブラウザインスタンスを使用したWebアプリケーションと対話している、とのセッションはサーバー側でタイムアウトしていないとのために命。同じセッション内のすべてのリクエスト間で共有されます。
  • HttpServletRequestそしてHttpServletResponse完全な応答(Webページ)が到着するまでサーブレットは、クライアントからのHTTPリクエストを受信した時点からのライブ。それはされていない他の場所で共有しました。
  • すべてServletFilterおよびListenerインスタンスは限りウェブアプリは生きて住んでいます。それらは、すべてのセッションのすべての要求間で共有されます。
  • 任意attributeに定義されていることServletContextHttpServletRequestおよびHttpSession質問の生活の中で対象限り生き続けます。オブジェクト自体は、JSF、CDI、SpringなどのBean管理フレームワークの「スコープ」を表します。これらのフレームワークは、スコープ付きBeanをattribute最も一致するスコープの1つとして格納します。

スレッドセーフ

そうは言っても、あなたの主な関心事はおそらくスレッドセーフです。これで、サーブレットとフィルタがすべてのリクエスト間で共有されることがわかりました。これはJavaの良いところです。マルチスレッドであり、異なるスレッド(読み取り:HTTPリクエスト)が同じインスタンスを利用できます。そうでない場合は再作成するにはあまりにも高価で、考えinit()およびdestroy()すべての単一の要求のためにそれら。

また、リクエストまたはセッションスコープのデータをサーブレットまたはフィルタのインスタンス変数として割り当ててはならないことも理解しておく必要があります。他のセッションの他のすべてのリクエスト間で共有されます。それスレッドセーフではありません!以下の例はこれを示しています。

public class ExampleServlet extends HttpServlet {

    private Object thisIsNOTThreadSafe;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadSafe;

        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    } 
}

参照:

  • JSF、サーブレット、JSPの違いは何ですか?
  • Javaでのセッション管理に最適なオプション
  • サーブレットマッピングURLパターンの/と/ *の違い
  • サーブレットでのdoGetとdoPost
  • サーブレットは、複数の同時ブラウザ要求を同期的に処理しているようです
  • サーブレットがスレッドセーフではないのはなぜですか?
431
Jops 2013-07-07 06:38.

セッション

つまり、Webサーバーは、最初の訪問時に各訪問者に一意の識別子を発行します。訪問者は、次回認識されるように、そのIDを持ち帰る必要があります。この識別子により、サーバーは、あるセッションが所有するオブジェクトを別のセッションのオブジェクトから適切に分離することもできます。

サーブレットのインスタンス化

もしのload-on-startupがある

もしのload-on-startupがある

彼がサービスモードとグルーブに入る同じサーブレットが他のすべてのクライアントからの要求に対して機能します。

クライアントごとに1つのインスタンスを持つのはなぜ良い考えではないのですか?これについて考えてみてください。注文ごとに1人のピザ屋を雇いますか。そうすれば、すぐに廃業するでしょう。

ただし、リスクはわずかです。覚えておいてください:この一人の男はすべての注文情報をポケットに入れています。したがって、サーブレットのスレッドセーフに注意しないと、特定のクライアントに間違った注文を与える可能性があります。

42
Chris Thompson 2010-06-24 14:20.

Javaサーブレットのセッションは、PHPなどの他の言語のセッションと同じです。これはユーザーに固有です。サーバーは、Cookie、URL書き換えなど、さまざまな方法でそれを追跡できます。このJava doc記事では、Javaサーブレットのコンテキストで説明し、セッションの維持方法がサーバーの設計者に任されている実装の詳細であることを示しています。この仕様では、サーバーへの複数の接続にわたってユーザーに固有のものとして維持する必要があることのみが規定されています。両方の質問の詳細については、Oracleのこの記事を確認してください。

編集サーブレット内でセッションを操作する方法に関する優れたチュートリアルがここにあります。そして、ここにJavaサーブレット、それらが何であるか、そしてそれらを使用する方法についてのSunの章があります。これらの2つの記事の間で、すべての質問に答えられるはずです。

33
Ajay Takur 2012-02-23 02:54.

サーブレットコンテナ(Apache Tomcatなど)が起動すると、何か問題が発生したり、コンテナ側コンソールにエラーが表示されたりした場合は、web.xmlファイル(アプリケーションごとに1つのみ)から読み取ります。それ以外の場合は、すべてのWebをデプロイしてロードします。 web.xmlを使用するアプリケーション(デプロイメント記述子と名付けられました)。

サーブレットのインスタンス化フェーズでは、サーブレットインスタンスの準備ができていますが、次の2つの情報が欠落しているため、クライアント要求を処理できません
。1:コンテキスト情報
2:初期構成情報

サーブレットエンジンは、上記の欠落している情報をカプセル化するservletConfigインターフェイスオブジェクトを作成します。サーブレットエンジンは、servletConfigオブジェクト参照を引数として指定することにより、サーブレットのinit()を呼び出します。init()が完全に実行されると、サーブレットはクライアント要求を処理する準備が整います。

Q)サーブレットの存続期間中に、インスタンス化と初期化が何回発生しますか?

A)一度だけ(すべてのクライアント要求に対して新しいスレッドが作成されます)、サーブレットの1つのインスタンスのみが任意の数のクライアント要求を処理します。つまり、1つのクライアント要求サーバーを処理した後は停止しません。他のクライアント要求を待機します。つまり、どのCGI(クライアント要求ごとに新しいプロセスが作成されるか)の制限がサーブレットで克服されます(内部でサーブレットエンジンがスレッドを作成します)。

Q)セッションコンセプトはどのように機能しますか?

A)HttpServletRequestオブジェクトでgetSession()が呼び出されるときはいつでも

ステップ1:リクエストオブジェクトの着信セッションIDが評価されます。

ステップ2:IDが利用できない場合、新しいHttpSessionオブジェクトが作成され、対応するセッションID(つまり、HashTable)が生成されます。セッションIDはhttpservlet応答オブジェクトに格納され、HttpSessionオブジェクトの参照がサーブレットに返されます(doGet / doPost)。 。

ステップ3:IDが利用可能な新しいセッションオブジェクトが作成されていない場合、セッションIDはリクエストオブジェクトから取得され、セッションIDをキーとして使用してセッションのコレクションで検索が行われます。

検索が成功すると、セッションIDがHttpServletResponseに保存され、既存のセッションオブジェクト参照がUserDefineservletのdoGet()またはdoPost()に返されます。

注意:

1)制御がサーブレットコードからクライアントに移るとき、セッションオブジェクトがサーブレットコンテナ、つまりサーブレットエンジンによって保持されていることを忘れないでください

2)マルチスレッドは、サーブレット開発者の実装に任されています。つまり、クライアントの複数の要求を処理し、マルチスレッドコードについて気にする必要はありません。

短い形式:

サーブレットは、アプリケーションの起動時(サーブレットコンテナにデプロイされる)、またはサーブレットがインスタンス化されるときに最初にアクセスされるとき(起動時のロード設定に応じて)に作成され、サーブレットのinit()メソッドが呼び出されます。次に、サーブレット(その唯一のインスタンス)がすべての要求を処理します(そのservice()メソッドが複数のスレッドによって呼び出されます)。そのため、同期を設定することはお勧めできません。アプリケーションがデプロイ解除されたとき(サーブレットコンテナが停止したとき)は、サーブレットのインスタンス変数を回避する必要があります。destroy()メソッドが呼び出されます。

20
Lauri Lehtinen 2010-06-24 14:27.

セッション-クリス・トンプソンが言ったこと。

インスタンス化-サーブレットは、コンテナがサーブレットにマップされた最初のリクエストを受信したときにインスタンス化されます(サーブレットが起動時に<load-on-startup>要素を使用してロードするように構成されている場合を除くweb.xml)。同じインスタンスが後続のリクエストを処理するために使用されます。

13
tharindu_DG 2014-03-06 01:41.

サーブレット仕様JSR-315は、サービス(およびdoGet、doPost、doPutなど)メソッドでのWebコンテナの動作を明確に定義しています(2.3.3.1マルチスレッドの問題、9ページ)。

サーブレットコンテナは、サーブレットのサービスメソッドを介して同時リクエストを送信できます。サーブレット開発者は、リクエストを処理するために、サービスメソッド内の複数のスレッドとの同時処理のための適切な準備を行う必要があります。

推奨されていませんが、開発者の代替手段は、サービスメソッドに一度に1つのリクエストスレッドのみがあることを保証するコンテナを必要とするSingleThreadModelインターフェイスを実装することです。サーブレットコンテナは、サーブレットでリクエストをシリアル化するか、サーブレットインスタンスのプールを維持することで、この要件を満たすことができます。サーブレットが配布可能としてマークされたWebアプリケーションの一部である場合、コンテナは、アプリケーションが配布される各JVMにサーブレットインスタンスのプールを維持する場合があります。

SingleThreadModelインターフェースを実装していないサーブレットの場合、サービスメソッド(またはHttpServlet抽象クラスのサービスメソッドにディスパッチされるdoGetやdoPostなどのメソッド)がsynchronizedキーワードで定義されていると、サーブレットコンテナはインスタンスプールアプローチを使用できません。 、ただし、それを介してリクエストをシリアル化する必要があります。このような状況では、パフォーマンスに悪影響を与えるため、開発者はサービスメソッド(またはサービスメソッドにディスパッチされたメソッド)を同期しないことを強くお勧めします。

0
Mahesh Balasubramanian 2019-02-06 20:43.

上記の説明から明らかなように、SingleThreadModelを実装することにより、サーブレットはサーブレットコンテナによってスレッドセーフを保証できます。コンテナの実装では、次の2つの方法でこれを行うことができます。

1)リクエストのシリアル化(キューイング)を単一のインスタンスに-これは、サーブレットがSingleThreadModelを実装していないが、service / doXXXメソッドを同期しているのと似ています。または

2)インスタンスのプールを作成する-これは、サーブレットをホストする環境の制限パラメータ(メモリ/ CPU時間)とは対照的に、サーブレットの起動/初期化作業/時間の間のより良いオプションとトレードオフです。

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

ウィリアム王子は「非常に現代的なお父さん」だと王室の専門家は言う

ウィリアム王子は「非常に現代的なお父さん」だと王室の専門家は言う

ある王室の専門家が、特に彼の家族の他の王室の両親と比較して、ウィリアム王子が「非常に現代的な父親」であると考える理由を学びましょう.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

メイミー・ジョンソン、ニグロリーグでピッチングした女性、82歳で死去

メイミー・ジョンソン、ニグロリーグでピッチングした女性、82歳で死去

写真提供者:Khue Bui / AP Mamie Johnsonは、ニグロリーグでプレーする3人の女性の1人で、82歳で亡くなりました。ジョンソンは子供の頃から野球を始め、最初に全米女子プロ野球に挑戦しました。 17歳のリーグだが、黒人だったのでフィールドへの出場は許されなかった。

グローアップゴール:カルメンデラヴァラードは時代を超えた魅力の縮図です

グローアップゴール:カルメンデラヴァラードは時代を超えた魅力の縮図です

ジャックミッチェル/ゲッティイメージズ日曜日の夜、ダンサー、振付師、女優のカルメンデラヴァラードが第40回ケネディセンター名誉賞を受賞しました。今年は、ドナルドトランプ首長のクレチンが祝福されていないことで、この式典がさらに注目を集めました。まだ見事な86歳のとき、伝説的なパフォーマーであるde Lavalladeは失望せず、真の優雅さと美しさが時代を超えていることを示しました。

ファイナルファンタジーXVのマルチプレイヤーは少量でとても楽しいです

ファイナルファンタジーXVのマルチプレイヤーは少量でとても楽しいです

くそー、私はちょうどこのシャツを買いました。一部の人にとっては、ファイナルファンタジーXVのマルチプレイヤー拡張パックは、スクウェア・エニックスの壮大なRPGを友達と体験するための面白い(少しイライラする場合でも)方法です。

ナズは面会権をめぐってケリスを法廷に連れて行く

ナズは面会権をめぐってケリスを法廷に連れて行く

ナズとケリス(ローレンス・ルシエ/ゲッティイメージズ)ナズは息子とより多くの時間を過ごしたいと考えており、現在、元妻のケリスを正式な面会スケジュールのために法廷に連れて行っています。ブラストが入手した文書によると、ナズは彼がは「長年にわたってケリスと協力して働いてきた」が、ケリスは「彼女が自分にとって都合がよいと判断した場合にのみ、息子との監護権を行使することを許可している。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language