Asp.net mvc 4 忽略对操作的非ajax请求
我希望只有在XHR对象的请求下,操作才能用于性能。当我试图意识到: 在控制器中有一个操作:Asp.net mvc 4 忽略对操作的非ajax请求,asp.net-mvc-4,Asp.net Mvc 4,我希望只有在XHR对象的请求下,操作才能用于性能。当我试图意识到: 在控制器中有一个操作: public string Act() { string view=""; if(Request.Headers["p"]!="p") Response.Redirect("/",true); else view = GetActView(); retu
public string Act()
{
string view="";
if(Request.Headers["p"]!="p")
Response.Redirect("/",true);
else
view = GetActView();
return view;
}
它是通过单击附加函数的事件引起的:
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 value的地址行收集到操作地址。这是我的网站不允许的行为。如何正确防止用户的此类行为?您可以通过将请求更改为“POST”而不是“GET”来做到这一点。然后该操作应使用[HttpPost]属性修饰,如下所示:
[HttpPost]
public string Act()
{
}
您可以在控制器操作中使用
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()
{
}
您甚至可以为此编写自定义属性,如下所示:
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()
{
}
这可以应用于控制器方法,就像其他FFilter一样,如下所示:
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()
{
}
你不能可靠地做到这一点。更好的选择是设计应用程序,以便通过地址栏访问操作是可以的。那么在这种情况下,如何处理SPA?@JohnStiks我们使用多种方法实现安全功能。一个是在我的回答中,第二个是使用
AntiForgeryToken
应该注意,这可能是伪造的,并且不应该依赖于安全性。