Maison  >  Article  >  développement back-end  >  MVC5 restreint toutes les requêtes HTTP au POST

MVC5 restreint toutes les requêtes HTTP au POST

巴扎黑
巴扎黑original
2017-08-08 11:43:223794parcourir

Cet article présente principalement en détail la méthode de MVC 5 pour restreindre toutes les requêtes HTTP au POST. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Il y a un collègue aujourd'hui qui a soulevé cette question. une question, il voulait restreindre toutes les requêtes HTTP reçues par MVC au mode POST.

Dans le contenu suivant, je partagerai avec vous la méthode à laquelle j'ai pensé. Si vous avez d'autres méthodes, veuillez laisser un message.

1. Fonctionnalité HttpPostAttribute

La première chose qui me vient à l'esprit est que MVC fournit la fonctionnalité HttpPostAttribute, qui est utilisée pour restreindre la soumission des requêtes HTTP en mode POST .


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

Cette fonctionnalité ne peut être marquée que sur la méthode Action. Nous devons marquer chaque méthode Action et créer un codeur de cette façon, nous sommes sûrs de pouvoir. Je ne l'accepte pas.


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

 }

2. Utilisation de HttpModule

Dans le pipeline Asp.Net, vous pouvez utiliser HttpModule pour modifier l'objet HttpApplication Enregistrez votre propre gestionnaire d'événements pour les événements afin de contrôler toutes les requêtes HTTP.


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()
 {

 }
 }

Ajoutez les configurations pertinentes dans Web.config.


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

Après test, il peut répondre à nos exigences (les résultats des tests ne seront pas démontrés).

3. Filtre MVC

Dans MVC, les requêtes peuvent être contrôlées via des filtres globaux.


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

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

Inscrivez-vous en tant que filtre global au démarrage du programme.


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

4. Contraintes de routage

Lors de l'enregistrement d'un itinéraire, vous pouvez définir des contraintes de routage. De la manière suivante, la méthode de requête peut être limitée aux requêtes POST.


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. Remplacement des méthodes du contrôleur

Dans MVC, tous les contrôleurs héritent de Controller par défaut.

Nous pouvons définir une classe abstraite de BaseController, remplacer OnActionExecuting et d'autres contrôleurs héritent de BaseController.


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);
  }
 }
 }

Cette méthode nécessite de modifier les classes de base de tous les contrôleurs et n'est pas recommandée.

Bien sûr, si vous avez défini votre propre classe de base de contrôleur, la charge de travail de cette méthode est également très faible.

Résumé

Parmi les cinq méthodes ci-dessus, les deuxième, troisième et quatrième méthodes sont très simples, mais je préfère la quatrième méthode, car si les besoins changent , la charge de travail de maintenance est minime.

Si vous avez d'autres méthodes, merci de laisser un message, merci !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn