Tipik olarak, ihtiyacınız olan tek şey bu iki istek arasında bir durum taşımaktır. Aslında bunu JavaScript'e dayanmayan gerçekten eğlenceli bir yol var (<noscript /> düşünün).
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
Bu çerezle, /redirect.html ad / değer bilgisini almak için aşağıdaki istekte, bu ad / değer çifti dizesinde 4K veri (tipik çerez sınırı) kadar her türlü bilgiyi saklayabilirsiniz. Elbette bundan kaçınmalı ve bunun yerine durum kodlarını ve bayrak bitlerini saklamalısınız.
Bu isteği aldıktan sonra, size bu durum kodu için bir silme talebini yanıtlarsınız.
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
HTTP'm biraz paslı RFC2109 ve RFC2965 üzerinden bunun gerçekten ne kadar güvenilir olduğunu anlamaya çalışıyorum, tercihen çerezin tam olarak bir kez tur atmasını istiyorum, ancak bu mümkün değil, üçüncü taraf çerezleri de başka bir alan adına taşınıyorsanız sizin için sorun olabilir. Bu hala mümkündür, ancak kendi alan adınızda bir şeyler yaptığınız kadar ağrısız değildir.
Buradaki sorun eşzamanlılıktır, eğer bir güç kullanıcısı birden fazla sekme kullanıyorsa ve aynı oturuma ait birkaç isteği araya sokmayı başarırsa (bu çok olası değildir, ancak imkansız değildir) bu, uygulamanızda tutarsızlıklara yol açabilir.
Anlamsız URL'ler ve JavaScript olmadan HTTP gidiş-dönüş yolculukları yapmanın <noscript /> yolu
Kavramın bir prof olarak bu kodu sağlar: Eğer bu kod aşina olmadığınız bir bağlamda çalıştırılırsa, hangi parçanın ne olduğunu çalışabilirsiniz düşünüyorum.
Buradaki fikir, yönlendirdiğinizde bazı durumlarla yeniden konumlandır'ı çağırmanızdır ve yeniden konumlandırdığınız URL, verileri (varsa) almak için GetState'i çağırır.
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;
}