原博文

https://www.cnblogs.com/h82258652/p/3939365.html

代码

/// <summary>
/// 仅允许Ajax操作
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class HandlerAjaxOnlyAttribute: ActionMethodSelectorAttribute
{
/// <summary>
/// 初始化仅允许Ajax操作
/// </summary>
public bool Ignore
{
get;
set;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ignore">是否取消验证,默认false。也就是默认进行验证。</param>
public HandlerAjaxOnlyAttribute(bool ignore = false)
{
Ignore = ignore;
}
/// <summary>
/// 验证请求有效性
/// </summary>
/// <param name="controllerContext"></param>
/// <param name="methodInfo"></param>
/// <returns></returns>
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
if(Ignore) return true;
return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest();
}
}

Action调用

[HandlerAjaxOnly]
public ActionResult CheckLogin(string loginname, string loginpassword)
{
try
{
T_User user = _iT_UserBLL.CheckLogin(loginname, loginpassword);
return Content("{\"success\":\"1\",\"message\":\"登录成功\"}");
}
catch(Exception ex)
{
return Content("{\"success\":\"0\",\"message\":\"" + ex.Message.ToString() + "\"}");
}
}

原理

(1)首先,ajax 请求跟一般的 web 请求本质是相同的,都是 http 请求。理论上服务器端是无法区分该次请求是不是 ajax 请求的,但是,既然标题都已经说了,那么肯定是有办法做的。
在 ajax 请求的请求报文里,往往会包含这么一条:X-Requested-With = XMLHttpRequest
这在各大的 javascript 框架上也是这么做的。

(2)IsValidForRequest 方法返回的是bool类型的值,指示对当前方法访问是否有效。
所以只需要返回对当前方法的访问是否是Ajax请求即可,
而Request类中有扩展方法IsAjaxRequest();,就是返回此状态的。
所以思路就清晰了。
 
(3)ActionMethodSelectorAttribute类源码

// 摘要:
// 表示一个特性,该特性用于影响操作方法的选择。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public abstract class ActionMethodSelectorAttribute: Attribute
{
// 摘要:
// 初始化 System.Web.Mvc.ActionMethodSelectorAttribute 类的新实例。
protected ActionMethodSelectorAttribute();
// 摘要:
// 确定操作方法选择对指定的控制器上下文是否有效。
//
// 参数:
// controllerContext:
// 控制器上下文。
//
// methodInfo:
// 有关操作方法的信息。
//
// 返回结果:
// 如果操作方法选择对指定的控制器上下文有效,则为 true;否则为 false。
public abstract bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo);
}

使用Attribute限制Action只接受Ajax请求的更多相关文章

  1. Controller 的 Action 只接受 Ajax 请求

    ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求. 2014-08-27 14:19 by h82258652, 555 阅读, 2 评论, 收藏, 编辑 首 ...

  2. ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求。

    首先,ajax 请求跟一般的 web 请求本质是相同的,都是 http 请求.理论上服务器端是无法区分该次请求是不是 ajax 请求的,但是,既然标题都已经说了,那么肯定是有办法做的. 在 ajax ...

  3. 让webapi只接受ajax请求

    为了测试先做一个简单的webapi,直接用新建项目时默认的就可以了.   在浏览器中测试request get,得到结果   然后再项目中新建一个AjaxOnly的类   AjaxOnly继承Acti ...

  4. 限制action所接受的请求方式或请求参数

    原文:http://www.cnblogs.com/liukemng/p/3726897.html 2.限制action所接受的请求方式(get或post): 之前我们在HelloWorldContr ...

  5. 如何判断一个请求为ajax请求?

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和XML). ajax的请求头如下: 如上图所示具有“X-Request-With”属性,该 ...

  6. 利用闭包实现多次ajax请求只执行最后一次

    点一个按钮,则向服务器请求资源,不作处理时,多次点击后会有很多个请求在等待.我们知道一般我们用ajax是异步请求,那么我们快速重复点击一个按钮得到的结果其实我们并不知道是哪次点击的结果可能是第一次可能 ...

  7. asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染

    在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...

  8. springmvc中只接受固定提交内容类型的请求

    springmvc中的@RequestMapping注解是用来处理请求地址映射的,如果某个接口我们只接受请求的提交内容类型(Content-Type)为application/json或text/ht ...

  9. springmvc接受及响应ajax请求。 以及@RequestBody 和@ResponseBody注解的使用

    1.发送ajax请求 $.ajax({ url:"user/testAjax", contentType:"application/json;charset=UTF-8& ...

随机推荐

  1. 15.java设计模式之访问者模式

    基本需求: 电脑需要键盘鼠标等固定的组件组成 现在分为个人,组织等去买电脑,而同一种组件对不同的人(访问者)做出不同的折扣,从而电脑的价格也不一样 传统的解决方法:在组件内部进行判断访问人的类型,从而 ...

  2. Java基础教程——线程池

    启动新线程,需要和操作系统进行交互,成本比较高. 使用线程池可以提高性能-- 线程池会提前创建大量的空闲线程,随时待命执行线程任务.在执行完了一个任务之后,线程会回到空闲状态,等待执行下一个任务.(这 ...

  3. MySQL replace into那些隐藏的风险

    目录 replace into时存在主键冲突 replace into时存在唯一索引冲突 replace into时存在主键冲突&唯一索引冲突 存在问题 结论 MySQL中 replace i ...

  4. 使用react终端运行npm start时报错

    npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! my-app@0.1.0 start: `react-scripts start` npm ERR ...

  5. 修改MongDB的数据类型

    语法: db.集合.find({"列":{$type:2}}).forEach(function(x){ x.列=parseFloat(x.列);db.order.save(x) ...

  6. Linux学习之iostat命令详解

    我们可以用iostat 命令来监视系统输入/输出.设备负载,这通过观察与它们的平均传送速率相关的物理磁盘的活动时间 来实现.iostat 命令生成的报告可以用来更改系统配置,从而更好地平衡物理磁盘和适 ...

  7. PyQt(Python+Qt)学习随笔:QMainWindow的splitDockWidget方法将QDockWidget停靠窗分割排列

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 主窗口的splitDockWidget方法用于将一个停靠窗占据的空间分 ...

  8. 乌云wooyun网站硬盘复活

    AWD比赛防止没有网络,在移动硬盘里面准备一个乌云漏洞库. 之前也想过弄一个乌云的镜像网站,无奈学生机性能太低下了,部署到公网上服务器存储空间都不够,只能部署在本地硬盘了. 乌云镜像的开源地址:htt ...

  9. Django 框架基本操作(二)

    一.设计表结构 1.班级表结构 表名:grade 字段:班级名称(gname).成立时间(gdate).女生总数(ggirlnum).男生总数(gboynum).是否删除(isDelete) 2.学生 ...

  10. [BJDCTF 2nd]old-hack && [GXYCTF2019]禁止套娃

    [BJDCTF 2nd]old-hack 页面很有意思 同时也告诉了我们是THINKPHP5,我们只需要寻找THINKPHP5的漏洞就可以了. https://www.codercto.com/a/5 ...