今天有位同事,提出了这样一个问题,他想限制所有MVC接收到的HTTP请求必须是POST方式。

  接下来在下面的内容中,将我想到的方式分享给大家,如果大家有其它的方式,请留言。

一、HttpPostAttribute特性

  大家首先想到时的,MVC提供了HttpPostAttribute特性,是用于限制HTTP请求必须POST方式来提交。

  1. public class HomeController : Controller
  2. {
  3. [HttpPost]
  4. public ActionResult Index()
  5. {
  6. return View();
  7. }
  8. }

  这个特性只能在Action方法上面做标记,需要我们在每一个Action方法上面做标记,做一个Coder,这种方式,我们肯定接收不了。

  1. //
  2. // 摘要:
  3. // 表示一个特性,该特性用于限制操作方法,以便该方法仅处理 HTTP POST 请求。
  4. [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
  5. public sealed class HttpPostAttribute : ActionMethodSelectorAttribute
  6. {
  7.  
  8. }

二、使用HttpModule

  Asp.Net管线中,可以通过 HttpModule 对 HttpApplication 对象中的事件注册自己的事件处理程序,来控制所有的HTTP请求。

  1. public class HttpMethodModule : IHttpModule
  2. {
  3. public void Init(HttpApplication context)
  4. {
  5. context.PostMapRequestHandler += Context_PostMapRequestHandler;
  6. }
  7.  
  8. private void Context_PostMapRequestHandler(object sender, EventArgs e)
  9. {
  10. HttpApplication httpApplication = (HttpApplication) sender;
  11. HttpContext httpContext = httpApplication.Context;
  12.  
  13. //判断当前是否使用的是 MVC 框架来处理请求,其它的请示不做控制。
  14. MvcHandler mvcHandler = httpContext.Handler as MvcHandler;
  15.  
  16. if (mvcHandler != null && httpContext.IsPostMethod() == false) {
  17. throw new HttpException(, "访问的资源不存在。");
  18. }
  19. }
  20.  
  21. public void Dispose()
  22. {
  23.  
  24. }
  25. }

  在Web.config增加相关的配置。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <system.webServer>
  4. <modules>
  5. <add name="HttpMethod" type="HttpPostWebApp.Web.HttpMethodModule, HttpPostWebApp"/>
  6. </modules>
  7. </system.webServer>
  8. </configuration>

  经过测试,是可以达到我们的要求(关于测试结果不在做演示)。

三、MVC过滤器

  在MVC中,可以通过全局的过滤器来控制请求。

  1. public class HttpPostFilter : IAuthorizationFilter
  2. {
  3. public void OnAuthorization(AuthorizationContext filterContext)
  4. {
  5. if (filterContext.HttpContext.IsPostMethod() == false) {
  6.  
  7. //如果不是POST请求,则返回404。
  8. filterContext.Result = new HttpNotFoundResult();
  9. }
  10. }
  11. }

在程序启动时,注册为全局过滤器。

  1. public class FilterConfig
  2. {
  3. public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  4. {
  5. filters.Add(new HttpPostFilter());
  6. }
  7. }

四、路由约束

  在注册路由时,可以定义路由的约束。通过如下方式,可以将请求方式限制为POST请求。

  1. public class RouteConfig
  2. {
  3. public static void RegisterRoutes(RouteCollection routes)
  4. {
  5. routes.MapRoute(
  6. name: "Default",
  7. url: "{controller}/{action}/{id}",
  8. defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  9. //限制请求方式必须是POST
  10. , constraints:new { httpMethod = new HttpMethodConstraint("POST")}
  11. );
  12. }
  13. }

五、重写Controller方法

  在MVC中,所有控制器默认继承于Controller。

  我们可以定义一个BaseController的抽象类,重写OnActionExecuting,其它的控制器都继承于BaseController。

  1. public abstract class BaseController : Controller
  2. {
  3. protected override void OnActionExecuting(ActionExecutingContext filterContext)
  4. {
  5.  
  6. if (filterContext.HttpContext.IsPostMethod() == false) {
  7. //如果不是POST请求,则返回404。
  8. filterContext.Result = new HttpNotFoundResult();
  9. }
  10. else {
  11. base.OnActionExecuting(filterContext);
  12. }
  13. }
  14. }

  这种方法,需要修改所有控制器的基类,不推荐。

  当然如果你已经定义了自己的控制器基类,这种方式的工作量也是非常小的。

总结

  上述五种方法中,二、三、四方法都非常简单,但是我比较推荐方法四,因为如果需求发生变化,维护工作量是最小的。

  如果大家有其它的方式,请留言,谢谢!

  Demo下载:http://files.cnblogs.com/files/tdfblog/HttpPostWebApp.zip

MVC 5限制所有HTTP请求必须是POST方式的更多相关文章

  1. MVC 5限制所有HTTP请求必须是POST

    今天有位同事,提出了这样一个问题,他想限制所有MVC接收到的HTTP请求必须是POST方式. 接下来在下面的内容中,将我想到的方式分享给大家,如果大家有其它的方式,请留言. 一.HttpPostAtt ...

  2. ASP.NET MVC 实现AJAX跨域请求方法《1》

    ASP.NET MVC 实现AJAX跨域请求的两种方法 通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新.但有的时候需要向其它域发送AJAX请求,完成数据 ...

  3. spring mvc(2):请求地址映射(@RequestMapping)

    @RequestMapping 参数说明 value定义处理方法的请求的 URL 地址.method定义处理方法的 http method 类型,如 GET.POST 等.params定义请求的 UR ...

  4. MVC的Ajax的异步请求

    MVC的Ajax的异步请求 在这里小写一下MVC的异步请求的一点小总结. 个人认为是有两种的,一种就是跟webform一样的,依旧是使用jQuery的$.get()方法,只是请求地址不同,webfor ...

  5. 请求转发:MVC设计模式、细节、请求域属性的编程实例、请求重定向和请求转发的区别

      请求转发:MVC设计模式.细节.请求域属性的编程实例.请求重定向和请求转发的区别 MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层) ...

  6. ASP.NET MVC 实现AJAX跨域请求的两种方法

    通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新.但有的时候需要向其它域发送AJAX请求,完成数据的加载,例如Google. 在ASP.NET MVC 框 ...

  7. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

  8. Spring MVC中forward请求转发2种方式(带参数)

    Spring MVC中forward请求转发2种方式(带参数) http://www.51gjie.com/javaweb/956.html  

  9. SpringMVC 之 mvc:exclude-mapping 不拦截某个请求

    在使用 SpringMVC 是,配置了一个 Session 拦截器,用于拦截用户是否登录,但是用户访问登录页面和注册页面时就不需要拦截了,这时就需要用到这个标签了 <mvc:execlude-m ...

随机推荐

  1. canvas-star7.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 笔记-返回到前一个页面时显示前一个页面中ajax获取的数据

    笔记第一部分:http://www.cnblogs.com/zczhangcui/p/6869219.html 在第一部分遇到的问题是,用ajax获取了一系列列表信息后,拼接好html后插入到了原有页 ...

  3. HTML常用标签及属性

    标签格式 格式: 双边:<标签名 属性1="值1" 属性2='值2' 属性3=值3>内容</标签名> 单边:<标签名 属性1="值1&quo ...

  4. 怎么在ReactNative里面使用Typescript

    今天来搞一搞怎么搭建一个可以使用Typescript的ReactNative环境好吧,一句废话不多说,直接开始好吧 1.全局安装create-react-native-app yarn global ...

  5. 安卓preview不显示的问题

    Render Problem Failed to load AppCompat ActionBar with unknown error 解决方法:将styles.xml文件中的: <resou ...

  6. Wim镜像编辑

    1.挂载install.wim文件为本地的一个文件夹 dism /mount-wim  /wimfile:D:\install.wim /index:1 /mountdir:D:\Win 注:1> ...

  7. Spark Word2Vec算法代码实现

    1 import com.hankcs.hanlp.tokenizer.NLPTokenizer import org.apache.hadoop.io.{LongWritable, Text} im ...

  8. python第八天)——购物车作业优化完成

    发现之前的三级菜单代码有BUG现已经修改过来了 购物车程序:启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够, ...

  9. Web的攻击技术笔记

    HTTP不具备必要的安全功能,就是一个通用的单纯协议机制,比如远程登录时会用到的SSH协议来说,SSH具备协议级别的认证及回话管理等功能,HTTP协议则没有.另外在架设SSH服务方面,任何人都可以轻易 ...

  10. 【PAT】B1052 卖个萌(20 分)

    实在不想写这个题,好费劲,头疼,这是粘的柳婼的代码 ,等我有空再自己用c写吧 #include <iostream> #include <vector> using names ...