Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich alle HTTP-Anfragen auf POST beschränken?

Wie kann ich alle HTTP-Anfragen auf POST beschränken?

零下一度
零下一度Original
2017-06-19 10:09:202953Durchsuche

Dieser Artikel stellt hauptsächlich die Methode von MVC 5 vor, alle HTTP-Anfragen auf POST zu beschränken. Es hat einen gewissen Referenzwert.

Es gibt heute einen Kollegen, der dies angesprochen hat Als Frage wollte er alle von MVC empfangenen HTTP-Anfragen auf den POST-Modus beschränken.

Im folgenden Inhalt werde ich Ihnen 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 .


public class HomeController : Controller
 { 
 [HttpPost]
 public ActionResult Index()
 {
  return View();
 }
 }

Diese Funktion kann nur auf der Aktionsmethode markiert werden und auf diese Weise einen Coder erstellen. Ich akzeptiere es nicht.


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

 }

2. Verwenden von HttpModule

In der Asp.Net-Pipeline können Sie HttpModule zum Ändern verwenden Das HttpApplication-Objekt Registrieren Sie Ihr eigenes Ereignishandler-Programm für das Ereignis, um alle HTTP-Anfragen zu steuern.


public class HttpMethodModule : IHttpModule
 {
 public void Init(HttpApplication context)
 {
  context.PostMapRequestHandler += Context_PostMapRequestHandler;
 }

 private void Context_PostMapRequestHandler(object sender, EventArgs e)
 {
  HttpApplication httpApplication = (HttpApplication) sender;
  HttpContext httpContext = httpApplication.Context;


  //判断当前是否使用的是 MVC 框架来处理请求,其它的请示不做控制。
  MvcHandler mvcHandler = httpContext.Handler as MvcHandler;

  if (mvcHandler != null && httpContext.IsPostMethod() == false) {
  throw new HttpException(404, "访问的资源不存在。");
  }
 }

 public void Dispose()
 {

 }
 }

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


<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
 <modules>
 <add name="HttpMethod" type="HttpPostWebApp.Web.HttpMethodModule, HttpPostWebApp"/>
 </modules>
 </system.webServer>
</configuration>

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

3. MVCFilter

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


public class HttpPostFilter : IAuthorizationFilter
 {
 public void OnAuthorization(AuthorizationContext filterContext)
 {
  if (filterContext.HttpContext.IsPostMethod() == false) {

  //如果不是POST请求,则返回404。
  filterContext.Result = new HttpNotFoundResult();
  }
 }
 }

Registrieren Sie sich beim Start des Programms als globaler Filter.


public class FilterConfig
 {
 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 {
  filters.Add(new HttpPostFilter());
 }
 }

4. Routing-Einschränkungen

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


public class RouteConfig
 {
 public static void RegisterRoutes(RouteCollection routes)
 {
  routes.MapRoute(
  name: "Default",
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  //限制请求方式必须是POST
  , constraints:new { httpMethod = new HttpMethodConstraint("POST")}
  );
 }
 }

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.


public abstract class BaseController : Controller
 {
 protected override void OnActionExecuting(ActionExecutingContext filterContext)
 {
  
  if (filterContext.HttpContext.IsPostMethod() == false) {
  //如果不是POST请求,则返回404。
  filterContext.Result = new HttpNotFoundResult();
  }
  else {
  base.OnActionExecuting(filterContext);
  }
 }
 }

Diese Methode erfordert eine Ä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 zweite, dritte und vierte Methode sehr einfach, aber ich bevorzuge Methode vier, denn wenn sich die Bedürfnisse ändern Der Wartungsaufwand ist minimal.

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

Demo-Download: mvchttppostwebapp

Das obige ist der detaillierte Inhalt vonWie kann ich alle HTTP-Anfragen auf POST beschränken?. 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