【问题标题】:How to prevent users from visiting Deleted action method directly?如何防止用户直接访问 Deleted 操作方法?
【发布时间】:2010-12-21 18:16:42
【问题描述】:

场景:

单击产品列表的一个产品上的删除超链接将调用/Product/Delete HttpGet 操作方法。然后用户单击确认按钮调用/Product/DeleteHttpPost 操作方法,该操作方法又将用户重定向到/Product/DeletedHttpGet 操作方法。

我想防止用户跳过/Product/Delete 直接调用/Product/Deleted

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2


    【解决方案1】:

    在重定向之前将一些内容放入TempData。然后在Deleted 操作中验证TempData 中是否存在此内容。

    [HttpPost]
    public ActionResult Delete()
    {
        // TODO: Delete
        TempData["deleted"] = true;
        return RedirectToAction("deleted");
    }
    
    public ActionResult Deleted()
    {
        if(TempData["deleted"] == null)
        {
            throw new HttpException(404, "not found");
        }
        return View();
    }
    

    您应该知道,这样做是有代价的。如果用户在浏览/product/deleted 操作时按F5,他将得到404。所以基本上你正在尝试做的是糟糕的设计,我建议你避免它。

    【讨论】:

    • 这里值得指出的是,当您执行导致状态更改的操作时,应优先使用 POST 而不是 GET。从长远来看,使用这种形式的分离将使您受益。
    • @xport,不,您不需要将其设置为空。在后续调用中它将自动为 null。这就是 TempData 的工作原理。它自动失效。这就是为什么我指出如果用户按 F5 刷新他会得到 404,因为 TempData 将失效。
    • @Jamie Dixon,这就是这里使用的。请注意 Delete 操作上的 [HttpPost] 属性。
    • @xport,正确,TempData 是为单个重定向或更准确地说是在将某些内容存储到 TempData 之后的单个请求而维护的。
    • @xport:我认为如果 TempData 为空,您应该只重定向到删除页面,从而让他们有机会确认。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多