質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.60%

  • Java

    13503questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JSP

    907questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

  • サーブレット

    118questions

    サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

セッションスコープに保存されたオブジェクトは、サーバ側とクライアント側のどちらですか?

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,345

k499778

score 496

プログラミング経験1年半のものです。
前回先輩から次のような質問をされました。



「セッションスコープに保存されたオブジェクトは、サーバ側とクライアント側のどちらですか?」



サーブレットのセッション管理のことなのかなと思い調べているのですが、正確な答えを確認できていません。HTTPsessionも調べています。

もしわかる方がいらっしゃれば教えて頂きたいと思います。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

保存されたオブジェクトが存在するのは、サーバ側ですね。
サーバはセッションIDという一意な文字列を生成し、このセッションIDに紐付ける形でオブジェクトをサーバ上に保存します。

そして、サーバからクライアントに対して、「あなたのセッションIDはコレですよ。以降の通信ではこのセッションIDを使用してくださいね。」と教えてあげます。

クライアントはサーバから教えてもらったセッションIDを以降の通信(リクエストヘッダ)に乗せて通信を行います。
サーバはクライアントから送られてくるセッションIDを用いて、以前保存した情報との紐付けを解決します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/16 15:20

    applepenguinさん
    回答ありがとうございます!
    サーバー側なんですね。わかってよかったです。

    ちなみに
    HttpSession session = req.getSession();
    がjavaに書くから、サーバー側にオブジェクトが存在する。
    という考え方は間違っていますか?

    下記リンク。サーブレットのソース参照。
    http://ash.jp/java/webapp_scope.htm

    キャンセル

  • 2015/04/16 15:47

    サーバ側にデータ(オブジェクト)を保存したいから、
    HttpSession session = req.getSession(); を書くというのが正しいかもしれません。

    HttpSession session = req.getSession();のタイミングで、
    サーバはセッションIDを生成します。

    そして、そのセッションに対して
    session.setAttribute("KEY","データ"); を実行することで、
    セッションに情報を紐付けることができます。

    セッションを用いる例として、ショッピングカートの例がよくありますよね。
    買い物カゴに入れた商品をセッションに保存しておくことで、リクエストをまたいで
    情報を引き継ぐことができます。

    もし、セッションを用いずにショッピングカートを実現しようとすると、
    以前ショッピングカートに追加した商品を、すべてのリクエストに引き継いで持たせないといけません。




    キャンセル

  • 2015/04/16 16:13

    applepenguinさん
    追加質問失礼しました。お気遣いのほど感謝しています。
    追加回答ありがとうございます。

    そうですね。私もニュアンスとしては

    > サーバ側にデータ(オブジェクト)を保存したいから、
    > HttpSession session = req.getSession(); を書くというのが正しいかもしれません。

    の通りだったのですが、
    聞き方を少し間違えたなと思っていました。

    サーバ側かクライアント側かの確かめ方として
    HttpSession session = req.getSession(); を Javaに書くからサーバ側だと確認できる。という考え方は合っているか。

    と伝えたかったのですが、大雑把に聞きすぎてしまったと思います。

    概念があるからjavaに書く。というのは理解していたのですが、
    javaに書くからそういった概念になる。のような聞き方をしてしまいました。


    そうなんですね!私もそれで私の認識もあっていると確認できたのでうれしいです。


    ショッピングカートの例私も見ました。いろいろとアドバイスありがとうございます。
    もう少し勉強します。


    キャンセル

0

一般には applepenguin さんが回答されている通りですが、Ruby on Railsのデフォルト設定であるCookieStoreの場合だと、暗号化したセッション情報をクライアント側に保存し、サーバー側で展開していますね。そういう例もありますということで。

ちなみに
HttpSession session = req.getSession();
がjavaに書くから、サーバー側にオブジェクトが存在する。
という考え方は間違っていますか?

それは間違っています。
HTTPにおけるCookieの仕組み、リクエストヘッダとレスポンスヘッダの存在、サーバーサイドにおけるデータの永続化はどうなっているか(オンメモリ, DB, etc...) について掘り下げて理解した方がいいですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/16 15:47

    AknEpさん
    回答ありがとうございます。

    私の環境はJavaなのでapplepenguinさんから教えて頂いた理解でとりあえずいいのかなと思っていますが、Rubyだとそういった例もあるんですね!

    そうでしたか。
    もしそうなら具体的に確認できるので理解しやすいなと思いましたが
    少し違うようですね。仕組みや概念的なところをもう少し勉強してみます。

    AknEpさん感謝しています。

    キャンセル

0

req.getSession();

この部分で内部的にやっていることを、よく意識するとよいです。
おおまかな処理の流れはおそらく以下のようになっているはずです。

1. reqに送られてきてHTTPリクエストヘッダに含まれるCookieのうち、そのアプリケーションのセッションID名に対応する文字列(=セッションID)を取得する
2. 内部のデータベース(もしくはメモリ)を参照し、1で取得したセッションIDに一致するセッションデータを探す
3. 正しいデータがあれば返す。 (なければおそらくnullとかが返るんでしょう)

と、こんなところです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/16 16:17

    AknEpさん
    追加回答ありがとうございます。

    なるほど。ソースではそこを意識して内部的にやっていることを追えばいいのですね。
    今セッション管理の仕組みの画像を見たりして理解を深めております。

    参考にさせていただきます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13503questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JSP

    907questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

  • サーブレット

    118questions

    サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

  • トップ
  • Javaに関する質問
  • セッションスコープに保存されたオブジェクトは、サーバ側とクライアント側のどちらですか?