>  기사  >  백엔드 개발  >  MVC5는 모든 HTTP 요청을 POST로 제한합니다.

MVC5는 모든 HTTP 요청을 POST로 제한합니다.

巴扎黑
巴扎黑원래의
2017-08-08 11:43:223842검색

이 글에서는 모든 HTTP 요청을 POST로 제한하는 MVC 5의 방법을 주로 소개합니다. 이는 특정 참조 값을 가지고 있습니다. 관심 있는 친구들은 이를 참고할 수 있습니다.

오늘 동료가 그런 질문을 제기했는데, 그는 모든 HTTP를 제한하고 싶습니다. MVC가 POST 모드에 있도록 요청을 받았습니다.

다음 내용에서는 제가 생각한 방법을 공유해 드릴게요. 혹시 다른 방법이 있으시면 메시지 남겨주세요.

1. HttpPostAttribute 기능

모두가 가장 먼저 생각하는 것은 MVC가 POST 모드에서 제출되는 HTTP 요청을 제한하는 데 사용되는 HttpPostAttribute 기능을 제공한다는 것입니다.


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

이 기능은 Action 메서드에만 표시할 수 있으며 각 Action 메서드를 표시하고 Coder를 만들어야 합니다.


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

 }

2. HttpModule 사용

Asp.Net 파이프라인에서는 HttpModule을 사용하여 HttpApplication 개체의 이벤트에 대한 고유한 이벤트 처리기를 등록하여 모든 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()
 {

 }
 }

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>

테스트 후 요구 사항을 충족할 수 있습니다(테스트 결과는 시연되지 않습니다).

3. MVC 필터

MVC에서는 전역 필터를 통해 요청을 제어할 수 있습니다.


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

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

프로그램 시작 시 글로벌 필터로 등록하세요.


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

4. 라우팅 제약 조건

경로 등록 시 라우팅 제약 조건을 정의할 수 있습니다. 다음과 같은 방법으로 요청 방법을 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. 컨트롤러 메서드 재정의

MVC에서 모든 컨트롤러는 기본적으로 Controller에서 상속됩니다.

BaseController의 추상 클래스를 정의하고 OnActionExecuting을 재정의하며 다른 컨트롤러는 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);
  }
 }
 }

이 방법을 사용하려면 모든 컨트롤러의 기본 클래스를 수정해야 하며 권장되지 않습니다.

물론, 자체 컨트롤러 기본 클래스를 이미 정의한 경우 이 방법의 작업량도 매우 적습니다.

요약

위 5가지 방법 중 2번, 3번, 4번 방법은 매우 간단하지만 요구사항이 바뀌면 유지관리 작업량이 최소화되기 때문에 4번 방법을 추천합니다.

다른 방법이 있으시면 메시지 남겨주세요. 감사합니다!

위 내용은 MVC5는 모든 HTTP 요청을 POST로 제한합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.