2008-11-16 21 views

回答

2

如果您为每个链接提供URL中唯一的ID(例如GUID)作为参数,则可以跟踪所有请求你已经处理完毕。 (如果你不介意这个机制不工作,如果有人让浏览器打开几天然后刷新刷新,你可以清除“旧”请求。)当你第一次看到一个GUID时,把它写入表中。如果再次看到它,请重定向到错误页面。

虽然这很丑,用户可以编辑URL来稍微改变GUID。 (您可以通过记录GUID当你生成它解决这最后的漏洞,并更新表指示何时它已经使用

一般情况下,用户希望能够刷新页面,但 - 特别是对于GET请求(即使大多数用户不知道这意味着什么)。你为什么想这样做?

-2

你可以使用客户端隐藏变量来存储计数器,或者你可以把计数器放在会话中。那么我会建议你刷新页面过期有办法可以实现这个禁用缓存等[像所有银行网站一样]。

0

你可以这样做,但我相信你不应该这样做。用户控制着浏览器,如果她觉得自己很爽快,那么你的工作就是确保页面刷新。返回错误页面是错误的答案。

1

那么,你可以使用一个非常有名的技术叫做“Syncronizing Token”或类似的东西= D,主要用于发送表单。

这会像这样:

  1. 创建一个函数来提供一个伪随机字符串标记。

  2. 对于您的每个请求页面,请检查Session中是否存在变量,例如:Session [“synctoken”](如果存在)。如果不是,那么这是第一次生成令牌并将其存储在那里。

  3. 每个链接请求,例如:“mypage.aspx”将一个名为synctoken的get与另一个标记放在一起,与您在Session中存储的标记不同,它会像“mypage.aspx?synctoken = 2iO02-3S23d” 。 (Request.QueryString [“synctoken”]!= null)。然后,回到(2),在请求中,如果令牌存在于会话中,则检查是否存在GET(Request.QueryString [“synctoken”]!= null)。如果否,则发送错误。如果是,请检查令牌(会话和GET)是否不同。如果它们不同,则可以将GET存储到Session(Session [“synctoken”] = Request.QueryString [“synctoken”])并转到步骤(2)。如果不是,那么用户刷新页面,出现错误。

它是这样:

if (Session["synctoken"] != null) { 
    if (Request.QueryString["synctoken"] != null) { 
     if (Request.QueryString["synctoken"].ToString().Equals(Session["synctoken"].ToString())) { 
      // Refresh! Goto Error! 
      MyUtil.GotoError(); 
     } 
     else { 
      // It is ok, store the token and go on! 
      Session["synctoken"] = Request.QueryString["synctoken"]; 
     } 
    } 
    else { 
     MyUtil.GotoErrorPage(); 
    } 
} 
else { 
    Session["synctoken"] = MyUtil.GenerateToken(); 
} 

很抱歉,如果我不能更清楚..祝你好运!

+0

好的,得到了​​一个减号,但我甚至不知道为什么!很抱歉帮忙。 – 2008-11-16 15:00:34

相关问题