我希望该操作仅适用于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值的地址行来解决问题。我网站的这种不允许的行为。如何正确防止用户的这种行为?
答案 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()
{
}