web-dev-qa-db-ja.com

Javaのセッション管理に最適なオプション

Javaでセッションを管理する最良の方法。クッキーはブラウザに保存され、後でアクセスできるため、このための信頼できるオプションではないと聞きました。これは正しいです?可能であれば、コーディング例で答えを見つけてください。

どれが最高ですか:

  • RL Rewriting:サーバーはURLリンクの最後に追加のパラメーターを追加します
  • フォームの非表示パラメーター:サーバーはHTMLのすべてのフォームに追加パラメーターを追加します
  • cookie:サーバーはブラウザにcookieの維持を要求します。
52

セッション管理(クライアント識別、Cookie処理、セッションスコープデータの保存など)は、基本的にappserver自体によって既に行われています。心配する必要はまったくありません。 HttpSession#setAttribute() および #getAttribute()により、セッション内のJavaオブジェクトを設定/取得することができます。 。クライアントがCookieをサポートしていない場合の本当に注意が必要なのは、URLの書き換えだけです。次に、jsessionid識別子をURLに追加します。 JSPでは、JSTLの c:url を使用できます。サーブレットでは、これに HttpServletResponse#encodeURL() を使用できます。このようにして、サーバーは新しい要求URLを読み取ることでクライアントを識別できます。

あなたの新しい質問はおそらく「しかし、これはクッキーにどのように関係しているのでしょうか?サーバーはそれをどうやって行うのでしょうか?」でしょう。答えは次のとおりです。サーバーがクライアントからリクエストを受信し、サーバー側のコード(コード)が HttpSessionHttpServletRequest#getSession() まだ誰も作成されていない間(新しいセッションでの最初のリクエスト)、サーバーは新しいものを作成します。サーバーは、長く一意で推測しにくいID( HttpSession#getId() で取得できるID)を生成し、このIDを値として設定しますjsessionidという名前のCookie。内部では、サーバーは HttpServletResponse#addCookie() を使用します。最後に、サーバーは、セッションIDをキーとして、Mapを値として、ある種のHttpSessionにすべてのセッションを保存します。

HTTP Cookie仕様 によれば、クライアントは後続のリクエストのヘッダーで同じCookieを送り返す必要があります。内部では、サーバーは HttpServletRequest#getCookies()jsessionid Cookieを検索し、その値を決定します。このようにして、サーバーは関連するHttpSessionを取得し、HttpServletRequest#getSession()を呼び出すたびにそれを返すことができます。

要点:クライアント側に保存されるのはセッションID(Cookieのフレーバー)のみであり、HttpSessionオブジェクト(そのすべての属性を含む)はサーバー側(Javaの)に保存されますメモリ)。自分でセッション管理を心配する必要はありません。また、セキュリティを心配する必要もありません。

こちらもご覧ください:

67
BalusC

すべてのJava WebフレームワークはCookieまたはURLエンコードされたセッションIDをサポートします。正しいアプローチを自動的に選択するため、何もする必要はありません。コンテナからセッションオブジェクトをリクエストするだけで、詳細を処理します。

[編集] Cookieと特別なURLの2つのオプションがあります。両方のアプローチに問題があります。たとえば、セッションをURLにエンコードすると、人々はセッションを渡すことができます(たとえば、URLをメールに入れて)。これを理解したい場合は、セキュリティに関する記事をいくつか読んで、アプリサーバーを構築してください。それ以外の場合:Javaアプリサーバーはあなたのために正しいことをします。それについて考えないでください。

6
Aaron Digulla

CookieはセッションIDを保存するだけで、このIDはセッションの有効期限が切れると無効になります。

4
Pascal Thivent

サーブレット仕様 は、標準J2EEアプリケーションでセッションデータにアクセス/設定するためのAPIを定義します。また、セッションデータはサーバー側に保存され、セッション識別子以外はクライアントに転送されないことを定義します。セッションIDの転送方法には2つのメカニズムがあります。

1)リクエストURL jessionid = ....
2)Cookie

メカニズムは、クライアントの機能に基づいて自動的に決定されます。

[〜#〜] edit [〜#〜]。最適なオプションはありません。方法を定義するサーブレット仕様があります。

2

Httpは、ステートレスなクライアント側プル専用プロトコルです。

ステートフルな会話を実装するには、Java EE Webサーバーはクライアント側で一部の情報(セッションID)を非表示にする必要があり、使用できるメカニズムはHTTPおよびHTML仕様に従う必要があります。

この目標を達成するには、次の3つの方法があります。

  1. RL Rewriting:サーバーはURLリンクの最後に追加のパラメーターを追加します。
  2. フォームの非表示パラメーター:サーバーは、HTMLのすべてのフォームに追加パラメーターを追加します。
  3. cookie:サーバーはブラウザにcookieの維持を要求します。

基本的に、最新のWebサーバーには、自動的に使用する方法を選択する「フィルター」があります。
したがって、ブラウザが既にCookieサポートをオフにしていることをサーバーが検出した場合、他の方法に切り替わります。

1
Zanyking