使用Attribute限制Action只接受Ajax请求
原博文
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请求的更多相关文章
- Controller 的 Action 只接受 Ajax 请求
ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求. 2014-08-27 14:19 by h82258652, 555 阅读, 2 评论, 收藏, 编辑 首 ...
- ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求。
首先,ajax 请求跟一般的 web 请求本质是相同的,都是 http 请求.理论上服务器端是无法区分该次请求是不是 ajax 请求的,但是,既然标题都已经说了,那么肯定是有办法做的. 在 ajax ...
- 让webapi只接受ajax请求
为了测试先做一个简单的webapi,直接用新建项目时默认的就可以了. 在浏览器中测试request get,得到结果 然后再项目中新建一个AjaxOnly的类 AjaxOnly继承Acti ...
- 限制action所接受的请求方式或请求参数
原文:http://www.cnblogs.com/liukemng/p/3726897.html 2.限制action所接受的请求方式(get或post): 之前我们在HelloWorldContr ...
- 如何判断一个请求为ajax请求?
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和XML). ajax的请求头如下: 如上图所示具有“X-Request-With”属性,该 ...
- 利用闭包实现多次ajax请求只执行最后一次
点一个按钮,则向服务器请求资源,不作处理时,多次点击后会有很多个请求在等待.我们知道一般我们用ajax是异步请求,那么我们快速重复点击一个按钮得到的结果其实我们并不知道是哪次点击的结果可能是第一次可能 ...
- asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染
在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...
- springmvc中只接受固定提交内容类型的请求
springmvc中的@RequestMapping注解是用来处理请求地址映射的,如果某个接口我们只接受请求的提交内容类型(Content-Type)为application/json或text/ht ...
- springmvc接受及响应ajax请求。 以及@RequestBody 和@ResponseBody注解的使用
1.发送ajax请求 $.ajax({ url:"user/testAjax", contentType:"application/json;charset=UTF-8& ...
随机推荐
- 《高并发下的.NET》第2季 - 《memcached连接暴增案》第1集:问题表现
在<.NET 5.0 背锅案>第7集-大结局之后,园子和 .NET 继续过上了幸福生活...剧情很美好,现实很残酷...现实是旧案刚结,新案立至,而且新案与旧案有关联,被迫继续拍剧,并对该 ...
- X86中断/异常与APIC
异常(exception)是由软件或硬件产生的,分为同步异常和异步异常.同步异常即CPU执行指令期间同步产生的异常,比如常见的除零错误.访问不在RAM中的内存 .MMU 发现当前虚拟地址没有对应的物理 ...
- 朴素的模式匹配算法BF
1 #include <iostream> 2 using namespace std; 3 int BF(char S[], char T[]); 4 int main() 5 { 6 ...
- netty&websocket
1.先判断是不是http 消息,不是返回400,是则remove之前添加的http组件,动态添加websocket组件 添加WebSocket Encoder和WebSocket Decoder之后, ...
- vs2019 Com组件初探-通过IDispatch接口调用Com
vs2019 Com组件初探-简单的COM编写以及实现跨语言调用 上一篇实现了如何编写基于IDipatch接口的COM以及vbs如何调用编写的COM 本次主要是实现VBS的CreateObject函数 ...
- Mac MySQL 8.0 (免安装版) 主从集群搭建
一.下载解压包 打开 MySQL 官网地址:https://dev.mysql.com/downloads/mysql/ ,选择面安装版本. 二.解压文件 下载到合适文件夹,解压压缩包. 解压 mys ...
- 基于 MongoDB 动态字段设计的探索
一.业务需求 假设某学校课程系统,不同专业课程不同 (可以动态增删),但是需要根据专业不同显示该专业学生的各科课程的成绩,如下: 专业 姓名 高等数学 数据结构 计算机 张三 90 85 计算机 李四 ...
- vue上传视屏或者图片到七牛云
首先下载七牛云的JavaScript-SDK npm install qiniu-js 下载完成JavaScript-SDK以后就可以上传图片信息了 <template> <div& ...
- 使用Flutter重构斗鱼APP
Github源码地址:https://github.com/yukilzw/dy_flutter flutter重构的斗鱼直播APP 首页.娱乐为Material组件开发:直播间.鱼吧为纯自定义编写 ...
- 第15.13节 PyQt(Python+Qt)入门学习:Qt Designer的Spacers部件详解
一. 引言 在Designer的部件栏中,有两种类型的Spacers部件,下图中上面布局中为一个水平间隔部件(按钮1和按钮2之间的部件),下面布局中为一个垂直间隔部件(按钮3和4之间),如图: 这两种 ...