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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

8386閲覧

Sessionについて2

tryCSharp

総合スコア29

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2019/01/22 00:26

前提・実現したいこと

前回のSessionについての質問にて疑問が解消できていなかったので再度質問です。

今、私は以下のようなサイトを作ろうとしています。

  1. Page1でSession["id"]に値を格納する
  2. Response.Redirect("Page2")でPage2へ遷移する
  3. Page2で変数にSession["id"]の値を入れる
  4. Page2でSession["id"]の値を削除する

この場合、ブラウザの別タブや別ウィンドウを使った場合、Session["id"]とが上書きされてしまう恐れはないでしょうか。
上書きされてしまう恐れがある場合、それを回避する手段はあるのでしょうか?

補足情報(FW/ツールのバージョンなど)

開発環境は以下のようになります。
Oracle: Oracle 11g
サーバーOS:Windows Server 2012
クライアントOS:Windows7
.NET:4.0
サーバーIIS:8.0
クライアントIIS:10.0 Express
Visual Studio:2015 Community

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoorwm

2019/01/22 00:50

2つのタブで同じページを見たらどうなるのでしょうか?
tryCSharp

2019/01/22 02:15 編集

同じページが見られるようにしたいです。 Page1は一覧画面、そこから閲覧したいidのボタンを押すとPage2で詳細画面を表示するイメージです。 Page_Load()内で変数に入れてRemove()するように設計しています。
guest

回答2

0

ブラウザの別タブや別ウィンドウを使った場合、Session["id"]とが上書きされてしまう恐れはないでしょうか。

ブラウザによりますが、IE や Chrome などは「別タブや別ウィンドウ」でも同じセッションになるので、手順 3 の「Page2で変数にSession["id"]の値を入れる」で上書きされるのはどうしようもないです。(追記:勘違いしていたようです。下の 2019/01/23 13:14 の私のコメント参照)

ASP.NET の場合どのようにセッションを維持しているかと言うと ASP.NET の Session のデータに限ればデフォルトでセッションクッキーです。

ブラウザが「別タブや別ウィンドウ」でも同じセッションと見なせば、最初のセッションで受け取ったセッションクッキーは Web サーバーに送信されます。

下の画像はブラウザに Chrome を使って ASP.NET Web Forms アプリの Session を使うページにアクセスし、Fiddler を使って要求・応答をキャプチャしたものです。

下の画像の左のウィンドウで #1 が最初の要求で、その際応答ヘッダ―に含まれるセッションクッキーを受け取っています。

#32 は、#1 で使った Chrome は開いたまま、別に新たに Chrome を立ち上げ #1 とは別のページに要求を出したものです。要求ヘッダにセッションクッキーが含まれています。

イメージ説明

同じセッションクッキーなので、ASP.NET の Session も同じ、即ち同じキー(名前)で別のデータを入れれば上書きされます。

なお、セッションクッキーには expires 属性はついてないので、ブラウザを閉じれば消去されます。次のアクセスでは別のセッションと見なされます。

上書きされてしまう恐れがある場合、それを回避する手段はあるのでしょうか?

上記のことが理解できれば、手順 3 の「Page2で変数にSession["id"]の値を入れる」で上書きされるのは当たり前で、別のキー(名前)を使うという手段以外で回避しようという考えは出てこないと思うのですが。

投稿2019/01/22 05:10

編集2019/01/23 04:17
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tryCSharp

2019/01/22 05:29

ご回答ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/01/22 06:18 編集

クッキーとセッションの関係をよく理解されることをお勧めします。その理解があるのとないのとでは、今後の開発に大きな違いが出てくると思います。
退会済みユーザー

退会済みユーザー

2019/01/23 04:14

別スレッド https://teratail.com/questions/170350 からここに戻って読み直して気が付いたのですが、手順 3「Page2で変数にSession["id"]の値を入れる」は、 strId = Session["id"].ToString(); ということだったのでしょうか? 自分は、 Session["id"] = <別の Object>; ということだと思ってました。前者のことだったとすると自分の思い違いだったようですみません。 後者のようなことをしない限り書き換わることはないです。
guest

0

ベストアンサー

上書きされます。
HTTPリクエストとしては、どのタブからであるかは認識されませんので。
ただ、回避する方法がないではないです。

1.Page1でsession識別用の独自コードを発行
2.session['code']['id']にID値を保存
3.Page2への遷移時に、codeをクエリストリングに与える
4.Page2ではsession['code']['id']を参照する

具体例として、タブAとBでの遷移を考えてみますと

1.タブAでPage1を開く
session[A][id]=1
2.タブBでPage1を開く
session[B][id]=2
3.タブAでPage2を開く
session[A][id]を参照→1
session[A][id]を削除
4.タブBでPage2を開く
session[B][id]を参照→2
session[B][id]を削除

として、それぞれに応じたIDの参照、及び削除が可能になります。
ただし、TAB識別子とも言うべきcodeが正しく渡されない場合(クエリストリングをユーザーが手動で削除してアクセスした場合など)についても考慮し、Page1へ差し戻す等も検討する必要があります。

投稿2019/01/22 01:31

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tryCSharp

2019/01/22 02:40

ご回答ありがとうございます。 最初は id をクエリストリングで渡すことも考えたのですが、kunaiさんが懸念されるようにユーザーが手動で削除する可能性を考えて Session を使用するようにしましたのですが id は隠ぺいするような情報ではないので別に Session を使わずにクエリストリングで id を渡した方が良いような気がしてきました。 hidden でPOSTでも。。。 難しく考えすぎてはまった気がしてきました。 質問になってしまうのですが、WEBシステムを考える時、隠ぺいする必要のないものは Session は使わないですか?
kunai

2019/01/22 02:44

隠蔽すべきものでも暗号化してPOSTで送る場合もありますし、そのあたりは造り手の好みです。 扱うデータソースは同じ方が便利なので、秘匿性によらずsessionにブチ込んだりもします。 開発チーム内で意識が統一されていることが大事なので、相談してみるといいと思います。
tryCSharp

2019/01/22 03:16

社内システムなので一人で作っているので相談することが出来なくて。 同僚はWEBシステムは全然作ったことがなくて外注していたんですが今回は社内のみなので内製することにした次第です。 また質問で申し訳ないのですがもしkunaiさんが一人で開発する場合だったらどうされますか?
kunai

2019/01/22 03:33

セッションで管理すべきもの(継続的にサービス内で利用するもの)についてはセッションで保管し、入力→確認→登録、程度のデータはそのままPOSTしますかね? 時間がなかったり予算が少ない場合はそれらもセッションに入れると思います。 どういったデータをどう使おうとしているかによるので、「常にこう」と言う回答は難しいです。
tryCSharp

2019/01/22 04:18

ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問