โดยทั่วไปสิ่งที่คุณจะต้องมีคือดำเนินการบางสถานะระหว่างคำขอทั้งสองนี้ จริงๆแล้วมันมีวิธีที่ขี้ขลาดจริงๆในการทำเช่นนี้ซึ่งไม่ได้พึ่งพา JavaScript (คิดว่า <noscript />)
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
เมื่อมีคุกกี้นั้นคุณสามารถขอ /redirect.html เรียกข้อมูล name = value ต่อไปนี้เพื่อให้คุณสามารถเก็บข้อมูลประเภทใด ๆ ในสตริงคู่ชื่อ / ค่านี้สูงสุดถึง 4K ของข้อมูล (ขีด จำกัด คุกกี้ทั่วไป) แน่นอนคุณควรหลีกเลี่ยงสิ่งนี้และเก็บรหัสสถานะและค่าสถานะบิตแทน
เมื่อได้รับคำขอนี้คุณจะตอบกลับพร้อมกับลบคำขอสำหรับรหัสสถานะนั้น
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
HTTP ของฉันเป็นสนิมเล็กน้อยฉันได้รับราง RFC2109 และ RFC2965 เพื่อคิดว่าเชื่อถือได้จริงหรือไม่โดยเฉพาะฉันต้องการให้คุกกี้ไปกลับอย่างแน่นอนหนึ่งครั้ง แต่ดูเหมือนจะไม่เป็นไปได้เช่นกันคุกกี้ของบุคคลที่สาม อาจเป็นปัญหาสำหรับคุณหากคุณย้ายที่อยู่ไปยังโดเมนอื่น สิ่งนี้ยังคงเป็นไปได้ แต่ไม่เจ็บปวดเมื่อคุณทำสิ่งต่าง ๆ ภายในโดเมนของคุณเอง
ปัญหาที่นี่คือการเกิดขึ้นพร้อมกันถ้าผู้ใช้ระดับสูงกำลังใช้หลายแท็บและจัดการการแทรกสองคำขอที่อยู่ในเซสชั่นเดียวกัน (ซึ่งไม่น่าเป็นไปได้มาก แต่ไม่เป็นไปไม่ได้) สิ่งนี้อาจนำไปสู่
เป็น <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;
}