오늘 동료가 MVC에서 수신하는 모든 HTTP 요청을 POST 모드로 제한하고 싶다는 질문을 제기했습니다.
다음 내용에서는 제가 생각한 방법을 공유해 드릴게요. 혹시 다른 방법이 있으시면 메시지 남겨주세요.
모두가 가장 먼저 생각하는 것은 MVC가 POST 모드에서 제출되는 HTTP 요청을 제한하는 데 사용되는 HttpPostAttribute 기능을 제공한다는 것입니다.
1 public class HomeController : Controller2 { 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 : ActionMethodSelectorAttribute6 {7 8 }
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 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 }
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에서는 전역 필터를 통해 요청을 제어할 수 있습니다.
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 FilterConfig2 {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 //限制请求方式必须是POST10 , constraints:new { httpMethod = new HttpMethodConstraint("POST")}11 );12 }13 }
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 }
이 방법은 모든 컨트롤러의 기본 클래스를 수정해야 하며 권장되지 않습니다.
물론 자체 컨트롤러 기본 클래스를 이미 정의한 경우 이 방법의 작업량도 매우 적습니다.
위 5가지 방법 중 2번, 3번, 4번 방법은 매우 간단하지만, 요구 사항이 변경되면 유지 관리 작업량이 최소화되므로 4번 방법을 선호합니다.
다른 방법이 있으시면 메시지 남겨주세요. 감사합니다!
위 내용은 MVC 5는 모든 HTTP 요청을 POST로 제한합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!