Normalerweise benötigen Sie nur einen Status zwischen diesen beiden Anforderungen. Es gibt tatsächlich eine wirklich funky Möglichkeit, dies zu tun, die nicht auf JavaScript basiert (denken Sie an <noscript />).
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
Mit diesem Cookie können Sie in der folgenden Anfrage an /redirect.html die Name = Wert-Informationen abrufen. Sie können jede Art von Information in dieser Name / Wert-Paar-Zeichenfolge speichern, bis zu 4 KB Daten (typisches Cookie-Limit). Natürlich sollten Sie dies vermeiden und stattdessen Statuscodes und Flag-Bits speichern.
Nach Erhalt dieser Anfrage antworten Sie im Gegenzug mit einer Löschanforderung für diesen Statuscode.
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
Mein HTTP ist ein bisschen verrostet. Ich habe RFC2109 und RFC2965 durchgesehen, um herauszufinden, wie zuverlässig dies wirklich ist. Am liebsten möchte ich, dass der Cookie genau einmal einen Roundtrip ausführt, aber das scheint auch bei Cookies von Drittanbietern nicht möglich zu sein Dies kann ein Problem für Sie sein, wenn Sie in eine andere Domain umziehen. Dies ist immer noch möglich, aber nicht so schmerzlos wie wenn Sie Dinge in Ihrer eigenen Domain tun.
Das Problem hierbei ist die Parallelität. Wenn ein Hauptbenutzer mehrere Registerkarten verwendet und es schafft, mehrere Anforderungen derselben Sitzung zu verschachteln (dies ist sehr unwahrscheinlich, aber nicht unmöglich), kann dies zu Inkonsistenzen in Ihrer Anwendung führen.
Dies ist die <noscript /> Methode, um HTTP-Roundtrips ohne bedeutungslose URLs und JavaScript durchzuführen
Ich stelle diesen Code als Profi des Konzepts zur Verfügung: Wenn dieser Code in einem Kontext ausgeführt wird, mit dem Sie nicht vertraut sind, können Sie meiner Meinung nach herausfinden, welcher Teil was ist.
Die Idee ist, dass Sie Relocate mit einem bestimmten Status aufrufen, wenn Sie umleiten, und die URL, die Sie verschoben haben, GetState aufruft, um die Daten abzurufen (falls vorhanden).
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;
}