ASP.NET Response.Redirectがセッションを失った問題

1485 ワード

以前はASPをやっていました.NETの開発で気づかなかった問題は、広く使われているResponseです.Redirectメソッドは、サーバ側がResponseで新たに追加または変更したCookieをクライアントブラウザに返すことはないが、ウェブサイトのSessionは一般的にCookieによってクライアント一意の識別を行うため、ブラウザがGetメソッドで要求をサーバに初めて送信した後(クライアントブラウザがサーバに初めてアクセスしたため、クライアントブラウザにはCookieがSessionIDを格納していない)、サーバから返された応答でセッションID付きCookieが得られず、ブラウザが次の要求をサーバ側に送信すると、要求中にセッションID付きCookieが読めず、サーバ側はまた新しいセッションを作成し、サーバ上で作成されたセッションの最初の要求が失われる.この問題を引き起こす前提条件に注意:ブラウザは初めて要求をサーバ側に送信し、サーバ側はResponseを使用する.生成されたセッションID付きCookieがクライアントブラウザに送信されないようにRedirectメソッド.
 
サンプルコードは、ブラウザがxxxに最初の要求を送信する.aspxでSession値を設定し、ページyyyにジャンプします.aspxの後、yyy.aspxではxxxが読めません.aspxで設定Session値はRequest.Cookiesでxxxと生成されました.aspxの異なるSessionID.
Session["xxx"] = xxx;

Response.Redirect("yyy.aspx");

これはxxxのためです.aspxのResponse.Redirectは、生成されたセッションIDをCookieを介してブラウザに返信することなく、ブラウザがyyyに要求を送信する.aspxの場合、サーバ側はSessionID付きCookieを検出することなく、新しいSessionを生成して新しいセッションを開始すると、当然xxxでは得られない.aspxで設定したSession値です.
 
ソリューション:
ブラウザがサーバ側で生成するSessionIDを取得する前に、サーバ側はResponseを使用しないようにする.Redirectメソッドはジャンプを行い、代わりにクライアントURLアドレスのジャンプを行い、例えばJavascriptでブラウザのwindowを設定する.locationプロパティ.これにより、ブラウザが最初の要求のサーバ側応答を取得すると、セッションID付きCookieが得られ、その後の要求でこのセッションID付きCookieがサーバ側に送信され、セッションが継続される.