Un collègue a soulevé une question aujourd'hui. Il souhaitait restreindre toutes les requêtes HTTP reçues par MVC au POST.
Ensuite, 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.
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.
1 public class HomeController : Controller2 { 3 [HttpPost]4 public ActionResult Index()5 {6 return View();7 }8 }
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. Nous ne pouvons certainement pas accepter cette méthode.
1 //2 // 摘要:3 // 表示一个特性,该特性用于限制操作方法,以便该方法仅处理 HTTP POST 请求。4 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]5 public sealed class HttpPostAttribute : ActionMethodSelectorAttribute6 {7 8 }
Dans Asp.Net pipeline , vous pouvez enregistrer votre propre gestionnaire d'événements pour les événements dans l'objet HttpApplication via HttpModule afin de contrôler toutes les requêtes 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 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 }
Ajoutez les configurations pertinentes dans 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>
Après test, il peut répondre à nos exigences (les résultats des tests ne seront pas démontrés).
Dans MVC, les requêtes peuvent être contrôlées via des filtres globaux.
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 }
Lorsque le programme démarre, inscrivez-vous en tant que filtre global.
1 public class FilterConfig2 {3 public static void RegisterGlobalFilters(GlobalFilterCollection filters)4 {5 filters.Add(new HttpPostFilter());6 }7 }
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.
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 }
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.
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 }
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.
Parmi les cinq méthodes ci-dessus, les méthodes deux, trois et quatre sont très simples, mais je recommande la méthode quatre car si les exigences 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!