0

セッションオブジェクトが2つの異なる方法で取得される(または2つの異なる方法で記述される)コードに出くわしました。

を使用してHttpServletRequest

 someMethod(HttpServletRequest request){
 HttpSession session = request.getSession();
 //getAttribute from session
 }

そして使用するHttpSession

anotherMethod(HttpSession session){
//getAttribute from session
}

私はこの記事とSOに関する質問を読みました。しかし、私はまだいくつかの疑問を持っています。

誰かが私にこれらの違いを理解するのを手伝ってもらえますか?

アップデート

これらは両方ともSpringControllerのメソッドであり、これらは異なるajax呼び出しにマップされます。すべてのリクエストオブジェクトに関連付けられたセッションがあることを理解していますが、HttpSessionオブジェクトを渡すと、現在のセッションオブジェクトはどこにありますか(すべての属性をロードします)、またはどのように取得されますか?javascriptからメソッドを呼び出すとき、私は何も渡しません。

4

3 に答える 3

1
someMethod(HttpServletRequest request)

requestこれで、現在のオブジェクトを渡しています。そこから取得したりcurrent session、そこから属性を取得したりできます。次を使用して、リクエスト オブジェクトから現在のセッション オブジェクトを取得できます。

request.getSession(false)

*注: -既存のセッションを取得するためfalseにパラメータとしてを渡しgetSession(false)ます。セッションが存在しない場合は を返しnullますが、request.getSession()は常に新しいセッションを作成するため、他のセッションで以前の属性ストアを取得することはありません。

anotherMethod(HttpSession session)

ここで、どこかからオブジェクト自体を渡していsessionます..おそらく、sessionオブジェクトに多くの属性が含まれており、メソッドに多くのパラメーターを入れたくない..

ただし、この関連するすべてのsessionタスクを自分で実行し、他のクラスのメソッドにServlet渡す必要があります..attribute

于 2012-09-27T06:25:47.157 に答える
0

属性が 1 つしかない場合は、セッション オブジェクトをフロートする必要はありません。セッションオブジェクトを使用してアクセスするだけです。

HttpSession session = request.getSession(true);
session.getAttribute(name);

オブジェクトをフロートできる唯一の賢明なケースは、session多数の属性があり、各メソッドが独自の属性セットにアクセスすることです。いずれにせよ、メソッドは渡されたものに依存するsessionため、メソッドがどのように取得されたかを気にする必要はありません。

于 2012-09-27T06:29:19.507 に答える
0

これら 2 つの間に大きな違いはありません。複数回呼び出された場合、2 番目のメソッドを使用request.getSession()して、セッションをローカル キャッシュのように維持することで余分なメソッド呼び出しを 1 つなくすことができます (数百回呼び出されない限り、パフォーマンスの向上は無視できます)。

例えば、。

HttpSession session=request.getSession();
getFirstAttr(session);
getSecondAttr(session);
....
getHundredthAttr(session);

最初のメソッドを使用すると、そのメソッドが呼び出されるたびに 1 つの余分なメソッドが呼び出さrequest.getSession()れます。

于 2012-09-27T06:39:37.613 に答える