web-dev-qa-db-ja.com

Javaのセッションとは何ですか?

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

_ HttpSession ses = req.getSession(true);
_

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

_setAttribute("String", object);
_

'、'、および値をセッションオブジェクトにバインドします。

_getAttribute("String");
_

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

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

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

_(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に格納されている値。

14
user405398

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

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

Javaセッションの チュートリアル を読むことをお勧めします。各ユーザーは、Java Webサーバーがブラウザに送信するため、すべてのユーザーが同じ名前の属性を持つことができ、この属性に格納される値はすべてのユーザーで異なります。

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

13
Kaleb Brasee

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

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

物語はこのようになります:

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

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

乾杯

9
lucas1000001

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

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);
}
}
3
Sean