En règle générale, tout ce dont vous aurez besoin est de transporter un état entre ces deux demandes. Il y a en fait une façon vraiment funky de faire cela qui ne repose pas sur JavaScript (pensez <noscript />).
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
Avec ce cookie là, vous pouvez dans la demande suivante à /redirect.html récupérer les informations nom = valeur, vous pouvez stocker tout type d'informations dans cette chaîne de paire nom / valeur, jusqu'à 4K de données (limite de cookie typique). Bien sûr, vous devez éviter cela et stocker à la place les codes d'état et les bits d'indicateur.
Dès réception de cette demande, vous répondez en retour par une demande de suppression de ce code d'état.
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
Mon HTTP est un peu rouillé J'ai parcouru les RFC2109 et RFC2965 pour comprendre à quel point c'est vraiment fiable, de préférence je voudrais que le cookie fasse un aller-retour exactement une fois mais cela ne semble pas être possible, aussi, les cookies tiers peut être un problème pour vous si vous déménagez dans un autre domaine. C'est toujours possible, mais pas aussi indolore que lorsque vous faites des choses dans votre propre domaine.
Le problème ici est la concurrence, si un utilisateur avancé utilise plusieurs onglets et parvient à entrelacer quelques demandes appartenant à la même session (ce qui est très peu probable, mais pas impossible), cela peut entraîner des incohérences dans votre application.
C'est la façon <noscript /> de faire des allers-retours HTTP sans URL sans signification et JavaScript
Je fournis ce code comme un prof de concept: si ce code est exécuté dans un contexte que vous ne connaissez pas, je pense que vous pouvez déterminer quelle partie est quoi.
L'idée est que vous appelez Relocate avec un certain état lorsque vous redirigez, et l'URL que vous avez déplacé appelle GetState pour obtenir les données (le cas échéant).
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;
}