Як правило, все, що вам коли-небудь знадобиться, - це перенести деякий стан між цими двома запитами. Насправді це дійсно прикольний спосіб зробити це, який не покладається на JavaScript (подумайте <noscript />).
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
За допомогою цього файлу cookie ви можете в наступному запиті /redirect.html отримати ім’я = інформація про значення, ви можете зберігати будь-яку інформацію в рядку цієї пари / значення, до 4K даних (типовий ліміт файлу cookie). Звичайно, ви повинні уникати цього і зберігати коди статусу та біти прапорців.
Отримавши цей запит, у відповідь ви отримаєте запит на видалення цього коду статусу.
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
Мій HTTP трохи іржавий. Я переходив через RFC2109 і RFC2965, щоб зрозуміти, наскільки це насправді, бажано, я хотів би, щоб печиво було точно в один раз, але це, здається, не можливо, також сторонні файли cookie може стати для вас проблемою, якщо ви переїжджаєте на інший домен. Це все ще можливо, але не так безболісно, як коли ви робите речі у власному домені.
Проблема тут полягає в одночасності, якщо користувач живлення використовує кілька вкладок і вдається переплести пару запитів, що належать до одного сеансу (це дуже малоймовірно, але не неможливо), це може призвести до невідповідностей у вашій програмі.
Це <noscript /> спосіб здійснювати обхід HTTP безглуздими URL-адресами та JavaScript
Я надаю цей код як професор концепції: Якщо цей код працює у контексті, який вам не знайомий, я думаю, ви можете розробити, яка частина - що.
Ідея полягає в тому, щоб ви передзвонили переїхати з деяким станом при переадресації, а URL-адреса, яку ви перемістили, дзвонить GetState, щоб отримати дані (якщо такі є).
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;
}