0

サーブレットに。というメソッドがあるアプリケーションがありますUpdate(ReqIn, ReqOut)doGet&から呼び出してdoPost、Request変数とResponse変数を渡します。その後Update(...)、次の静的変数に入力する必要があります。

...
public class Server extends HttpServlet {

    public static HttpServletRequest In = null;
    public static HttpServletResponse Out = null;

    public static boolean isDebug = true;
    public static boolean isPost = false;

    public static String URL = "";
    public static String IP = "0.0.0.0";
    public static Cookie[] Cookies = null;

    public static UserClass User = null;
    public static boolean isLoggedIn = false;


    ...
}

基本的に、最もよく使用されるものを抽象化し、リクエストごとに更新します。Server.User.getUsername();これにより、ページが読み込まれるたびに新しいクラスインスタンスを作成し、はるかに長いアクセスコードを使用することで、WebサイトのどこからでもIPアドレスと現在のユーザーデータにアクセスできます。Server.getUser().getUsername();

ここで問題となるのは、マルチユーザー環境(AppEngineのJetty)で、これにより問題が発生する可能性があるかどうかです。たとえば、スレッド/レーシングの問題により、ユーザーに誤ったIPアドレスが表示されたり、極端な場合は突然別のユーザーとしてログインしたりしますか?

Public UserClass Userまたは、コードを書き直して、などの代わりに変更する必要がありPublic static UserClass Userますか?

4

2 に答える 2

7

統計を使用することは非常に悪い考えです。2つのリクエストが同時に入ってくると、それらは互いに上書きするからです。この些細な例を見て、何がうまくいかないかを確認してください。

1:public class Server extends HttpServlet {
2:  public static int requestNo = 0;
3:  public void doGet(HttpServletRequest req, HttpServletResponse resp)
4:  {
5:     requestNo++;
6:     resp.getWriter().println(requestNo);
7:  }
8:}

次のタイムラインを想像してみてください。

リクエスト1が着信し、5行目まで処理します。
リクエスト2が着信し、完全に処理します。
リクエスト1は処理を続行します。

どちらのリクエストも、一方が「1」を取得し、もう一方が「2」を取得するのではなく、テキスト「2」を取得します。これは、踏みつけられている状態の簡単な例です。

さて、あなたの質問の2番目の部分に答えるために;

または、コードを書き直して、Public staticUserClassUserなどではなくPublicUserClassUserに変更する必要がありますか?

いいえ、それでも十分ではありません。J2EE仕様では、サーブレットコンテナがクラスの1つのインスタンスを使用して、そのサーブレットマッピングのすべてのリクエストを処理できるためです。つまり、インスタンスレベルの変数は、静的、それらはすべてのリクエスト間で共有されます。

これにより、3つの実際のオプションのみが残ります。

  1. すべてをHTTPSessionに押し込みます。ここでの問題は、これがマップであるため、型の安全性が失われ、どこで使用されているかを確認するのが難しいことです。
  2. すべての状態を保持し、それをどこにでも渡すためのホルダークラスを作成します。少なくとも型安全性を失うことはないので、これは少し良いですが、それでも完全な可視性はありません。
  3. 個々の必要なアイテムを回します。
于 2009-12-04T21:31:55.093 に答える
6

はい、これは非常に悪い考えです!

同時に2つのリクエストを受け取った場合、どうなると思いますか?各静的変数は1つの値しか保持できないため、データが失われます。

各スレッドが処理している現在のリクエスト/ユーザーなどにのみアクセスできるように使用できますが、それでも基本的には悪い考えです。ThreadLocalそれはもろく、下の層が情報を必要としているという事実を隠します。代わりに、状態を必要とするコードに状態を渡します。

于 2009-12-04T20:36:52.390 に答える