ホームページ  >  記事  >  バックエンド開発  >  MVC5 はすべての HTTP リクエストを POST に制限します

MVC5 はすべての HTTP リクエストを POST に制限します

巴扎黑
巴扎黑オリジナル
2017-08-08 11:43:223795ブラウズ

この記事では主に、すべての HTTP リクエストを POST に制限するための MVC 5 の方法を詳しく紹介します。興味のある友人は参考にしてください。今日、同僚がそのような質問をしました。彼はすべての HTTP リクエストを制限したいと考えています。 MVC が受信した POST モードへの要求。

次に、以下の内容で、私が考えた方法を共有します。他の方法がある場合は、メッセージを残してください。

1. HttpPostAttribute 機能

誰もが最初に考えるのは、MVC が POST モードで送信される HTTP リクエストを制限するために使用される HttpPostAttribute 機能を提供しているということです。

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

この機能は、アクション メソッドでのみマークできます。これには、各アクション メソッドをマークしてコーダーを作成する必要があります。このメソッドは絶対に受け入れられません。

//
 // 摘要:
 // 表示一个特性,该特性用于限制操作方法,以便该方法仅处理 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 では、デフォルトですべてのコントローラーがコントローラーを継承します。

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。