通常,您所需要的只是在这两个请求之间携带一些状态。实际上有一种非常时髦的方法来做到这一点,它不依赖于JavaScript(想想<noscript/>)。
Set-Cookie: name=value; Max-Age=120; Path=/redirect.html
有了这个cookie,你可以在下面的请求/redirect.html中检索name=value信息,你可以在这个名称/值对字符串中存储任何类型的信息,最多4K的数据(典型的cookie限制)。当然,您应该避免这种情况,而是存储状态代码和标记位。
在收到此请求后,您将返回响应状态码的删除请求。
Set-Cookie: name=value; Max-Age=0; Path=/redirect.html
我的HTTP有点生锈了,我一直在通过RFC2109和RFC2965来弄清楚这有多可靠,最好我想让cookie精确地往返一次,但这似乎不可能,而且,如果你迁移到另一个域,第三方cookie可能对你来说是一个问题。这仍然是可能的,但并不像你在自己的领域内做事情那样轻松。
这里的问题是并发性,如果一个高级用户正在使用多个选项卡,并设法将属于同一个会话的几个请求交织在一起(这是非常不可能的,但也不是不可能),这可能会导致应用程序中的不一致。
这是<noscript/>的HTTP往返方式,没有无意义的url和JavaScript
我提供这段代码作为一个概念教授:如果这段代码运行在一个你不熟悉的上下文中,我认为你可以找出哪一部分是什么。
其思想是在重定向时使用某些状态调用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;
}