Biasanya, yang Anda perlukan hanyalah membawa beberapa kondisi di antara kedua permintaan ini. Sebenarnya ada cara yang sangat funky untuk melakukan ini yang tidak bergantung pada JavaScript (pikirkan <noscript />).
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
Dengan cookie itu di sana, Anda dapat dalam permintaan berikut untuk /redirect.html mengambil nama = info nilai, Anda dapat menyimpan segala jenis informasi dalam string pasangan nama / nilai ini, hingga 4K data (batas cookie tertentu). Tentu saja Anda harus menghindari ini dan menyimpan kode status dan bit bendera sebagai gantinya.
Setelah menerima permintaan ini, Anda membalasnya dengan permintaan penghapusan untuk kode status itu.
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
HTTP saya agak berkarat. Saya telah menggunakan RFC2109 dan RFC2965 untuk mengetahui seberapa andal ini sebenarnya, sebaiknya saya ingin cookie untuk pulang pergi sekali saja, tetapi itu sepertinya tidak mungkin, juga, cookie pihak ketiga mungkin menjadi masalah bagi Anda jika Anda pindah ke domain lain. Ini masih mungkin tetapi tidak sesakit ketika Anda melakukan hal-hal dalam domain Anda sendiri.
Masalahnya di sini adalah konkurensi, jika pengguna yang kuat menggunakan banyak tab dan mengelola untuk menyisipkan beberapa permintaan yang termasuk dalam sesi yang sama (ini sangat tidak mungkin, tetapi bukan tidak mungkin) ini dapat menyebabkan inkonsistensi dalam aplikasi Anda.
Ini adalah <noscript /> cara melakukan round trip HTTP tanpa URL dan JavaScript yang tidak berarti
Saya memberikan kode ini sebagai konsep yang luar biasa: Jika kode ini dijalankan dalam konteks yang tidak Anda kenal, saya pikir Anda dapat menentukan bagian apa yang dimaksud.
Idenya adalah bahwa Anda memanggil Relokasi dengan beberapa kondisi saat Anda mengarahkan ulang, dan URL yang Anda relokasi memanggil GetState untuk mendapatkan data (jika ada).
const string StateCookieName = "state";
static int StateCookieID;
protected void Relocate(string url, object state)
{
var key = "__" + StateCookieName + Interlocked
.Add(ref StateCookieID, 1).ToInvariantString();
var absoluteExpiration = DateTime.Now
.Add(new TimeSpan(120 * TimeSpan.TicksPerSecond));
Context.Cache.Insert(key, state, null, absoluteExpiration,
Cache.NoSlidingExpiration);
var path = Context.Response.ApplyAppPathModifier(url);
Context.Response.Cookies
.Add(new HttpCookie(StateCookieName, key)
{
Path = path,
Expires = absoluteExpiration
});
Context.Response.Redirect(path, false);
}
protected TData GetState<TData>()
where TData : class
{
var cookie = Context.Request.Cookies[StateCookieName];
if (cookie != null)
{
var key = cookie.Value;
if (key.IsNonEmpty())
{
var obj = Context.Cache.Remove(key);
Context.Response.Cookies
.Add(new HttpCookie(StateCookieName)
{
Path = cookie.Path,
Expires = new DateTime(1970, 1, 1)
});
return obj as TData;
}
}
return null;
}