忽略非ajax请求来执行操作

时间:2013-08-28 18:03:52

标签: asp.net-mvc-4

我希望该操作仅适用于XHR对象请求的性能。当我试图意识到: 在控制器中有一个动作:

      public string Act()
        {     
         string view="";
        if(Request.Headers["p"]!="p")
            Response.Redirect("/",true);
        else
            view = GetActView();

        return view;
        }

这是通过onclick附加功能的事件引起的:

       function updateDiv() { 
               xmlhttp = new XMLHttpRequest();   
           xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
              document.getElementById('actdiv').innerHTML = xmlhttp.responseText;
            } 
            }
           xmlhttp.open('GET', '/Act', true);
          xmlhttp.setRequestHeader("p", "p");
          xmlhttp.send();                
         }

但是除了来自此功能的请求之外,我还可以通过收集浏览器website.com/Act值的地址行来解决问题。我网站的这种不允许的行为。如何正确防止用户的这种行为?

2 个答案:

答案 0 :(得分:1)

您可以通过将请求更改为“POST”而不是“GET”来实现。然后该动作应该用[HttpPost]属性装饰,如下所示:

[HttpPost]
public string Act()
{     
}

答案 1 :(得分:1)

您可以使用Request.IsAjaxRequest在控制器操作中进行检查。对于您的操作,可以按照以下步骤进行操作:

public string Act()
{     
    if(Request.IsAjaxRequest)
    {
      //AJAX work or response
    }
   //Non-AJAX work

}

您甚至可以为此编写自定义属性,如下所示:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AjaxOnlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            var result = filterContext.Result as ViewResultBase;
            if (result != null && result.Model != null)
            {
                filterContext.Result = new JsonResult
                {
                    Data = result.Model,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
        }
    }
}

这可以像控制器方法一样应用,如下所示:

[AjaxOnly]
public string Act()
{     


}