【问题标题】:ASP.NET MVC: jQuery Address Prevent User from Navigating to Direct UrlASP.NET MVC:jQuery 地址阻止用户导航到直接 URL
【发布时间】:2011-10-28 15:06:46
【问题描述】:

我们正在开发一个 Ajax 应用程序并使用 jQuery Address 插件来加载应用程序的各个页面所以我们网站的 url 看起来像:www.app.com#/SomeController/SomeAction。导航到这样的 url 会加载应用程序的默认路由,然后使用 jQuery Address 将 SomeController/SomeAction url 加载到页面上的 div 中。

问题是用户仍然可以通过在浏览器中输入 url 直接访问 www.app.com/SomeController/SomeAction(无井号)。我们如何防止用户能够直接访问页面并要求他们在其中具有井号以确保通过 Ajax 请求加载页面?

【问题讨论】:

标签: jquery asp.net-mvc ajax jquery-address


【解决方案1】:

在默认路由之前创建要添加的路由,如下所示:

routes.MapRoute(
    "404 non-hashed",
    "{*fullPath}",
    new { controller = "Error", action = "Show404" },
    new { fullPath = @"^(?!#).+" }
);

此路由将处理任何不以哈希字符开头的请求。任何以哈希字符开头的请求都将失败路由约束,并将继续使用您的默认路由。

创建一个控制器和一个动作来显示一个 404 页面,或者一些自定义错误页面,然后你就设置好了。

【讨论】:

    【解决方案2】:

    您可以创建一个检查 request.isajaxrequest() 的过滤器。您拒绝任何不是默认路由的请求。

    我不确定这是否是最好的方法。

    【讨论】:

      【解决方案3】:

      counsellorben 是正确的,您可以使用路由技巧来尝试限制合法客户端或应用程序请求特定资源的方式,但您将永远无法保护自己免受伪造(使用 fiddler 或其他工具)。辅导员本提出的方法仅对潜在地避免用户混淆和限制应用程序的“API”区域有用。当然,您实际上不应该拥有仅依赖 # 个深层链接的应用,因为这会导致 SEO 等问题。但这是一个不同的讨论。

      另一种方法,而不是过滤器,您可以将以下内容添加到您的操作方法中

      if (this.HttpContext.Request.IsAjaxRequest() != true)
                  return RedirectToAction("Index");
      

      这里的标准做法是给锚一个空的或虚拟的 href 属性并让点击事件执行 AJAX 回调?这样,如果用户复制超链接,他就会自动获得正确的 URL。

      【讨论】:

      • 感谢您的评论。我完全同意这可能导致的 SEO 问题,但所有这些页面都不会被机器人抓取,因为用户必须经过身份验证才能访问应用程序。
      猜你喜欢
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      相关资源
      最近更新 更多