我们正在开发一个Ajax应用程序,并正在利用jQuery Address插件加载应用程序的各个页面所以我们网站的网址如下:www.app.com#/ SomeController / SomeAction。导航到这样的url会加载应用程序的默认路由,然后使用jQuery Address将SomeController / SomeAction url加载到页面上的div中。
问题是用户仍然可以通过在浏览器中输入网址直接访问www.app.com/SomeController/SomeAction(无哈希标志)。我们如何阻止用户直接访问页面并要求他们在那里有哈希标志以确保通过Ajax请求加载页面?
答案 0 :(得分:1)
您可以创建一个检查request.isajaxrequest()的过滤器。除了默认路由之外,您拒绝任何不需要的请求。
我不确定这是不是最好的方式。
答案 1 :(得分:1)
创建一条在默认路线之前添加的路线,如下所示:
routes.MapRoute(
"404 non-hashed",
"{*fullPath}",
new { controller = "Error", action = "Show404" },
new { fullPath = @"^(?!#).+" }
);
此路由将处理任何不以哈希字符开头的请求。任何以井号字符开头的请求都将失败路由约束,并将继续使用您的默认路由。
创建一个控制器和操作以显示404页面或某个自定义错误页面,然后进行设置。
答案 2 :(得分:0)
advisllorben是正确的,你可以做路由技巧,试图限制合法客户或应用程序请求特定资源的方式,但你永远无法保护自己免受锻造(使用提琴手或其他工具)。 counsellorben提出的方法仅用于潜在地避免用户混淆并限制应用程序的“API”区域。当然,你实际上不应该有一个仅依赖于#expout链接的应用程序,因为这会导致SEO等问题。但这是一个不同的讨论。
另一种方法,而不是过滤器,您可以将以下内容添加到您的操作方法
if (this.HttpContext.Request.IsAjaxRequest() != true)
return RedirectToAction("Index");
这里的标准做法是给锚一个空的或伪的href属性并让click事件执行AJAX回调?这样,如果用户复制超链接,他就会自动获得正确的URL。