通常,您只需要在这两个请求之间传递某种状态即可。实际上,有一种非常时髦的方法可以实现,它不依赖JavaScript(请考虑<noscript />)。
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
使用该cookie,您可以在以下请求中通过/redirect.html检索name = value信息,可以在此name / value对字符串中存储任何类型的信息,最多可以存储4K数据(典型cookie限制)。当然,您应该避免这种情况,而应存储状态代码和标志位。
收到此请求后,您会返回一个针对该状态码的删除请求。
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
我的HTTP有点生锈,我一直通过RFC2109和RFC2965来了解这确实有多可靠,我最好让cookie一次准确地往返一次,但这似乎也是不可能的, 第三方cookie如果您要移到另一个域,可能对您来说是个问题。这仍然是可能的,但并非像您在自己的域中进行工作时那样轻松。
这里的问题是并发性,如果高级用户正在使用多个选项卡并设法交织属于同一会话的几个请求(这不太可能,但并非不可能),这可能导致应用程序不一致。
这是在没有无意义的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;
}