16

これまでのところ、Java の Httpsession の概念を理解しています。

 HttpSession ses = req.getSession(true);

リクエストに応じて、セッション オブジェクトを作成します。

setAttribute("String", object);

'String' をバインドし、値を Session オブジェクトにバインドします。

getAttribute("String");

指定された文字列に関連付けられたオブジェクトを返します。

私が理解できないのは、次のようなセッションオブジェクトを作成し、 HttpSession ses = req.getSession(true); 呼び出して名前を設定していることsetAttribute("String", object);です。ここで、このコードはサーバー内に存在します。すべての人がログインしようとすると、サーバーで同じコードが実行されます。setAttribute("String", object);このメソッドでは、文字列値は定数です。したがって、作成された各セッション オブジェクトは、私が提供した同じ文字列によってバインドされます。彼のセッションを検証するために文字列を取得しようとすると、またはログアウト アクションが実行されている間getAttribute("String"); に、同じ定数文字列値が返されます (私は正しいですか?? 実際にはわかりません。実行のロジックを考えているだけです)。 . では、どうすれば無効化できるのでしょうか。

このタイプの図は、Web のすべてのチュートリアルで見ました。その属性を設定する実際の方法ですか?または、実際のアプリケーション開発者は、「文字列」フィールドに変数を指定して動的に設定します。

(ie. session.setAttribut(userName, userName); //Setting the String Dynamically.. I dono is it right or not.)

そして私の最後の質問は

WebContext ctx = WebContextFactory.get();
request = ctx.getHttpServletRequest();

上記の2行は何をしますか?ctx & request には何が保存されますか? HttpSession ses = req.getSession(true);新しいセッション手段を作成します。ses に格納されている値。

4

4 に答える 4

22

いくつかの [ランダムな] 精度:

  1. セッションを行うために、ログイン/ログアウトのメカニズムは必要ありません。
  2. Java サーブレットでは、HTTP セッションは、HTTP Cookie (最も一般的に使用される) または URL 書き換え (Cookie を使用しないブラウザーまたは Cookie を無効にしたブラウザーをサポートするため) の 2 つのメカニズムを使用して追跡されます。Cookie のみを使用するのは簡単です。特別なことをする必要はありません。URL を書き換えるには、サーブレット/フィルターを指すすべての URL を変更する必要があります。
  3. を呼び出すたびに、Cookie または URL パス パラメータ (セミコロンに続くもの) でエンコードされたセッション ID を見つけるためにrequest.getSession(true)、オブジェクトが検査されます。HttpRequestセッション ID が見つからない場合は、サーブレット コンテナー (サーバー) によって新しいセッションが作成されます。
  4. セッション ID は Cookie として応答に追加されます。URL の書き換えもサポートしたい場合は、response.encodeURL()メソッドを使用して HTML ドキュメント内のリンクを変更する必要があります。request.getSession(false)or を呼び出すrequest.getSession()と、セッション ID が見つからないか、セッション ID が無効なセッションを参照している場合に null が返されます。
  5. Java セッション Cookie はブラウザーに永続的に保存されないため、訪問ごとに 1 つの HTTP セッションが存在します。そのため、セッション オブジェクトはクライアント間で共有されません。各ユーザーには、独自のプライベート セッションがあります。
  6. セッションは、一定時間使用されない場合、自動的に破棄されます。タイムアウト値は、web.xmlファイルで構成できます。
  7. メソッドを使用して、特定のセッションを明示的に無効にすることができますinvalidate()
  8. 人々が について話しているときJSESSIONID、Java でセッション追跡を行うために使用される HTTP Cookie の標準名を指しています。
于 2010-09-08T14:04:34.477 に答える
13

Java セッションに関するチュートリアルを読むことをお勧めします。各ユーザーは、Java Web サーバーがブラウザーに送信する JSESSIONID 要求/応答パラメーターに基づいて、異なる HttpSession オブジェクトを取得します。したがって、すべてのユーザーが同じ名前の属性を持つことができ、この属性に格納される値はすべてのユーザーで異なります。

また、WebContextFactory と WebContext は、サーブレット パラメータを取得する簡単な方法を提供する DWR クラスです。

于 2010-09-08T13:32:15.657 に答える
10

私が理解しているように、あなたの懸念は、HttpSession に物を保存するときのさまざまなユーザーの分離に関するものです。

サーブレット コンテナー (Tomcat など) は、JSESSIONID を使用してこれを処理します。

話は次のようになります。

  1. ユーザーは最初に Web サイトにログオンします。
  2. サーブレット コンテナーは、ユーザーのブラウザーに COOKIE を設定し、UNIQUE jsessionId を格納します。
  3. ユーザーが Web サイトにアクセスするたびに、JSESSIONID Cookie が送り返されます。
  4. サーブレット コンテナはこれを使用して、誰が誰であるかを追跡します。
  5. 同様に、これはデータの分離を追跡する方法です。すべてのユーザーは、JSESSIONID によって一意に識別される独自のオブジェクトのバケットを持っています。

うまくいけば、それが(少なくとも部分的に)あなたの質問に答えます。

乾杯

于 2010-09-08T13:38:00.290 に答える
3

基本的なサーブレットは次のようになります

public class MyServlet{

public doGet(HttpServletRequest req, HttpServletResponse res){
//Parameter true: 
//    create session if one does not exist. session should never be null 
//Parameter false: 
//    return null if there is no session, used on pages where you want to 
//    force a user to already have a session or be logged in
//only need to use one of the two getSession() options here. 
//Just showing both for this test
HttpSession sess = req.getSession(true);
HttpSession sess2 = req.getSession(false); 

//set an Attribute in the request. This can be used to pass new values
//to a forward or to a JSP
req.setAttribute("myVar", "Hello World");
}

}

すでに行われているセッションの属性名を設定する必要はありません。他の人が他の回答で示唆しているように、CookieまたはURLの書き換えを使用してsessionIDを保存します。

DWR WebContextを処理しているときは、上記と同じことを実行しているだけです。通常、Requestオブジェクトはメソッドに渡されないため、WebContextを使用してその要求を取得します。

public class DWRClass {
 public doSomething(){
WebContext ctx = WebContextFactory.get();
HttpServletRequest req = ctx.getHttpServletRequest();
HttpSession sess = req.getSession(); //no parameter is the same as passing true

//Lets set another attribute for a forward or JSP to use
ArrayList<Boolean> flags = new ArrayList<Boolean>();
req.setAttribute("listOfNames", flags);
}
}
于 2010-09-08T14:59:56.587 に答える