Heim  >  Artikel  >  Backend-Entwicklung  >  MVC 5 beschränkt alle HTTP-Anfragen auf POST

MVC 5 beschränkt alle HTTP-Anfragen auf POST

巴扎黑
巴扎黑Original
2017-06-26 15:20:012018Durchsuche

Ein Kollege hat heute eine Frage gestellt. Er wollte alle von MVC empfangenen HTTP-Anfragen auf POST beschränken.

Als nächstes werde ich Ihnen im folgenden Inhalt die Methode mitteilen, die ich mir ausgedacht habe. Wenn Sie andere Methoden haben, hinterlassen Sie bitte eine Nachricht.

1. HttpPostAttribute-Funktion

Das erste, was mir in den Sinn kommt, ist, dass MVC die HttpPostAttribute-Funktion bereitstellt, die verwendet wird, um HTTP-Anfragen einzuschränken, die im POST-Modus übermittelt werden sollen.

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

Diese Funktion kann nur für die Aktionsmethode markiert werden. Wir müssen jede Aktionsmethode markieren und einen Coder erstellen. Wir können diese Methode definitiv nicht akzeptieren.

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

2. Verwenden von HttpModule

Im Asp.Net Pipeline können Sie über HttpModule Ihren eigenen Ereignishandler für Ereignisse im HttpApplication-Objekt registrieren, um alle HTTP-Anforderungen zu steuern.

 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 14             //判断当前是否使用的是 MVC 框架来处理请求,其它的请示不做控制。15             MvcHandler mvcHandler = httpContext.Handler as MvcHandler;16 17             if (mvcHandler != null && httpContext.IsPostMethod() == false) {18                 throw new HttpException(404, "访问的资源不存在。");19             }20         }21 22         public void Dispose()23         {24 25         }26     }

 Fügen Sie relevante Konfigurationen in Web.config hinzu.

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>

Nach dem Test kann es unsere Anforderungen erfüllen (die Testergebnisse werden nicht demonstriert).

3. MVC-Filter

In MVC können Anfragen über globale Filter gesteuert werden.

 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     }

Wenn das Programm startet, registrieren Sie sich als globaler Filter.

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

4. Routing-Einschränkungen

Beim Registrieren einer Route können Sie Routing-Einschränkungen definieren. Auf folgende Weise kann die Anfragemethode auf POST-Anfragen beschränkt werden.

 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                 //限制请求方式必须是POST10               , constraints:new { httpMethod =  new HttpMethodConstraint("POST")}11             );12         }13     }

5. Überschreiben von Controller-Methoden

In MVC erben standardmäßig alle Controller vom Controller.

Wir können eine abstrakte Klasse von BaseController definieren, OnActionExecuting überschreiben und andere Controller von BaseController erben.

 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     }

Diese Methode erfordert die Änderung der Basisklassen aller Controller und wird nicht empfohlen.

Wenn Sie Ihre eigene Controller-Basisklasse definiert haben, ist der Arbeitsaufwand dieser Methode natürlich auch sehr gering.

Zusammenfassung

Von den oben genannten fünf Methoden sind die Methoden zwei, drei und vier sehr einfach, ich empfehle jedoch Methode vier, denn wenn sich die Anforderungen ändern, ist der Wartungsaufwand minimal.

Wenn Sie andere Methoden haben, hinterlassen Sie bitte eine Nachricht, danke!

Das obige ist der detaillierte Inhalt vonMVC 5 beschränkt alle HTTP-Anfragen auf POST. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn