にglobal variable
電話がかかってきloginAttempt
ましたservlet class
。これがglobal variable
2つrequests
同時に当たるとどうなるの?
サーブレットにグローバル変数を持つことは悪ですか??
loginAttempt
側に置くと、doPost()
毎回初期化されます。
にglobal variable
電話がかかってきloginAttempt
ましたservlet class
。これがglobal variable
2つrequests
同時に当たるとどうなるの?
サーブレットにグローバル変数を持つことは悪ですか??
loginAttempt
側に置くと、doPost()
毎回初期化されます。
はい。
あなたの変数は、他のどのクラスでも読み書き可能です。それらすべてがそれで賢明なことを行うことを保証することはできません。それらの1つはそれを上書きしたり、誤ってインクリメントしたりする可能性があります。
これは、JVM ごとにサーブレットの 1 つのインスタンスです。そのため、複数のスレッドが同時にアクセスしようとする可能性があります。グローバルであり、同期/アクセス制御を提供していないため、スレッドセーフではありません。また、異なる JVM を持つある種のクラスターでサーブレットを実行した場合、変数はそれらの間で共有されず、複数の loginAttempt 変数を持つことになります。
サーブレットに含める必要がある場合は、静的にしますが、公開しないでください。アクセスして更新するためのゲッター/セッターを提供します。マルチスレッドが安全に更新および読み取りできるように、スレッドセーフなプログラミングについて学びます。
はるかに良いのは、サーブレットコンテキストに保存することです。これは、このようなサーブレット全体のデータを保存する場所です。
通常、作成されるサーブレットのインスタンスは 1 つだけであり、グローバル変数はそのサーブレットのすべてのクライアントによって共有されることを理解している限り、それらは悪ではありません。同時にユーザー。
グローバル変数がログイン試行回数をカウントしていると推測していますloginAttempt
が、これがスレッドセーフな方法で行われている限り、このサーブレットで行われたログイン試行回数をカウントする合理的な方法になります。ただし、これはすべてのユーザー向けです。ユーザーごとのログイン試行が必要な場合は、おそらくセッションを作成し、セッション コンテキストを使用してこの種の情報を保存する必要があります。
大量の同時アクセスでは、サーブレットのスレッドセーフの問題に注意を払う必要があるかもしれません...そして、この問題を回避するために次の方法を試すことができます...
1、</p>
public class loginAttempt extends HttpServlet implements SingleThreadModel {
...
}
2、 二番目の方法:synchronized
キーワードを使う
3、グローバル変数の使用を避ける
セッション属性として保存します。そうしないと、グローバル変数の概念が完全に台無しになります。1) Web サービスが再起動されても、セッション データは失われないため、セッションを使用することをお勧めします。
2) 負荷分散環境では、セッション データは中央の場所に保存されます。つまり、任意のサーバーが要求を処理し、セッション データにアクセスできます。
アクセス可能ですが、非表示になっています。