일반적으로 필요한 것은이 두 요청간에 상태를 전달하는 것입니다. 실제로 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를 통해 이것이 실제로 얼마나 신뢰할 수 있는지 파악했습니다. 바람직하게 쿠키를 한 번만 왕복하도록하고 싶지만 타사 쿠키 도 가능하지 않은 것 같습니다. 다른 도메인으로 이전하는 경우 문제가 될 수 있습니다. 이것은 여전히 가능하지만 자신의 도메인 내에서 일을 할 때만 큼 고통스럽지 않습니다.
고급 사용자가 여러 탭을 사용하고 동일한 세션에 속하는 두 개의 요청을 인터리브하도록 관리하는 경우 동시성 문제가 발생합니다 (매우 드물지만 불가능하지는 않음). 이로 인해 애플리케이션에 불일치가 발생할 수 있습니다.
의미없는 URL과 JavaScript없이 HTTP 왕복을 수행하는 <noscript /> 방식입니다
이 코드를 개념의 전문가로 제공합니다.이 코드가 익숙하지 않은 컨텍스트에서 실행되면 어떤 부분이 무엇인지 알아낼 수 있습니다.
아이디어는 리디렉션 할 때 일부 상태로 Relocate를 호출하고 재배치 한 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;
}