次のことをしようとしているようです。
たとえば、2 ページの質問表があり、最初のページには名があり、2 番目のページには姓があるとします。ユーザーが 2 つのタブを開き、各タブのアンケートに異なるデータを入力しながら、アンケートの異なるページにアクセスできるようにしたいと考えています。
タブ A では、名として Mark を入力して送信し、タブ A の 2 ページ目にいます。友人にもアンケートを行うことにしたので、新しいタブ、タブ B を開きます。 . タブ B に Tom と入力し、ページを送信します。
現在、ブラウザには、firstname = "Mark" のアンケートの 2 ページ目にあるタブ A と、firstname = "Tom" のアンケートの 2 ページ目にあるタブ B があります。ここでサーバー上でこれらの両方をセッションで維持したいと仮定すると、私はあなたにとってうまくいくと思うアプローチです。
Web ブラウザーがフォームのページ 1 を要求するとき、GET 要求 (サーバーにアンケート データが投稿されていない) で、応答 html に隠しフィールドを指定し、そのフィールドに格納する乱数を生成します。このフォームが送信されると、サーバーで次のことを行います。
- 乱数をキーにしてセッションを調べる "var questionaire = session[Request.Form["questionaire_rnumber"]]
アンケートがセッションにない場合は、新しいアンケートを作成し、そのプロパティを更新してセッションに貼り付けます
var questionaire = new Questionaire();
questionaire.FirstName = Request.Form["firstName"]
session[Request.Form["questionaire_rnumber"]] = questionaire;
アンケートがセッションにあった場合は、オブジェクトを更新して次のページを表示するだけですが、次のページを表示するときに、ページで使用したのと同じ乱数を使用して、html に非表示の乱数フィールドを再度指定する必要があります。 1.
このようにして、1 回のセッションで任意の数のアンケートを実施できます。MVC.NET を使用すると、乱数フィールドをビュー モデルに追加し、セッションで既存のアンケートを検索したり、新しいアンケートを作成したりするためのロジックを追加するのは簡単です。
戻るボタンの問題、セキュリティの問題、パフォーマンスの問題など、このアプローチで発生する可能性のある問題にも留意する必要があります。
セキュリティとパフォーマンスの問題の 1 つの例として、攻撃者がアプリケーションがこのように動作することに気づき、攻撃者がフォームのページ 1 を 10,000 回要求し、毎回ページ 1 を送信することがあります。その 1 つのユーザー セッションで 10,000 個のアンケート オブジェクトが存在することになります。攻撃者がセッション ID Cookie を 10,000 回削除し、セッション ID Cookie ごとにページ 1 の 10,000 リクエストを作成し、ページ 1 フォームを送信した場合、サーバー上の 10,000 セッションで累積的に 100,000 個のアンケート オブジェクトが作成されます。したがって、アプリケーションを保護するために、いくつかの制約を設定する必要があります。たとえば、次のようになります。
- 個々のセッションでは、セッション内に X 件のアンケートのみを含めることができます
- 個々の IP アドレスは、Y 個の同時セッションしか持つことができません (これは、おそらくアプリケーション オブジェクトで追跡する必要があります)。
追加のユースケースに対する追加の対応
ユースケースをありがとう。私の解決策はまだあなたのために働くはずです。2 つのオプションがあります。
ワークフローで動作するタブが 1 つだけであることを確認したい場合は、乱数が新しいタブからサーバーに渡されると、進行中の別のワークフローがあり、新しいタブからの乱数がタブは最初の乱数と一致しないため、例外をスローし、最初のワークフローを完了するまで新しいワークフローを開始できないというメッセージをユーザーに表示し、最初のワークフローをキャンセルするかどうかを尋ねます。最初に開始したワークフローでブラウザーを閉じると、セッションが期限切れになるまでスタックするため、キャンセルするかどうかを尋ねる必要があります。彼らが新しいワークフローを開始しようとし続けた場合、これは起こりません。
第 2 に、最初の回答で提案されているように、複数の作業を許可することもできますが、各ワークフローのコンテキストを乱数でセグメント化することもできます。全体的なポイントは、セッションで小さなミニセッションを作成していることですが、クライアントにのみ保存される値をキーにしています。フォームがサーバーにポストされると、各タブには異なる乱数があるため、その乱数を、そのタブから開始されたワークフローに関するすべての情報を含むセッション内のエントリと簡単に関連付けることができます。
お役に立てれば。