asp.net mvc Route 使用自定義條件(constraints)禁止某ip登錄

前言正則表達式

本文的目的是利用Mvc route建立一個自定義約束來控制路由跳轉實現禁止ip登錄,固然例子可能不合理,可是文章要代表的意思是當普通的路由約束不能解決咱們實際的需求時,咱們能夠經過自定義路由限制條件實現,好比當匹配路由有數據庫交互,根據url跳轉等實際需求時,使用自定義條件此問題即可迎刃而解。數據庫

實現url

舉例普通的路由約束:spa

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
 );
 匹配包含一個的整數productId的URLs。當定義一個route時,咱們可以使用一個限制條件來限制URLs,使它匹配這個route。在例子中,這個route包含一個只匹配整數的正則表達式約束。
這裏匹配一個整數的productId,當不知足這個條件是將交由另外一個route處理,或者,若是沒有匹配的routes, 「The resource could not be found 」錯誤將被返回,普通的路由約束能夠完成一些簡單的沒有業務邏輯的路由限制,好比限制某IP用戶訪問等,下面的自定義約束就是來解決這個問題。
 
自定義條件約束:
下面來看一些System.Web.Route給咱們提供的自定義約束的接口IRouteConstraint,定義以下:
// 摘要:
    //     定義類必須實現才能檢查某 URL 參數值是否對約束有效的協定。
    [TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
    public interface IRouteConstraint
    {
        // 摘要:
        //     肯定 URL 參數是否包含此約束的有效值。
        //
        // 參數:
        //   httpContext:
        //     一個對象,封裝有關 HTTP 請求的信息。
        //
        //   route:
        //     此約束所屬的對象。
        //
        //   parameterName:
        //     正在檢查的參數的名稱。
        //
        //   values:
        //     一個包含 URL 的參數的對象。
        //
        //   routeDirection:
        //     一個對象,指示在處理傳入請求或生成 URL 時,是否正在執行約束檢查。
        //
        // 返回結果:
        //     若是 URL 參數包含有效值,則爲 true;不然爲 false。
        bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection);
    }

咱們只要寫一個自定義約束類來實現此接口的Math方法,它返回一個布爾值。這個布爾值決定該請求是否應該被route對象處理。code

下面咱們來定義自定義路由約束:對象

public class AbandonConstraint : IRouteConstraint
        {
            public bool Match(HttpContextBase httpContext, Route route, string parameterName,
            RouteValueDictionary values, RouteDirection routeDirection)
            {
                var currentIp = httpContext.Request.UserHostAddress;
                //若是當前訪問用戶的ip是127.0.0.1,則匹配Abandon路由,若是不是則匹配其餘路由
                return currentIp == "127.0.0.1";
            }
        }

路由設置:blog

routes.MapRoute(
                name: "Abandon",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Abandon", id = UrlParameter.Optional },
                constraints:new { customConstraint = new AbandonConstraint() }//自定義限制路由
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

配置好之後,咱們本地運行程序,便能匹配到Abandon路由,若咱們修改所要限制的ip地址,則匹配Default路由。以下圖本地運行命中abandon默認地址的action繼承

總結:接口

自定義的路由約束在實際應用中對於複雜的路由匹配條件,好比有數據庫交互,提供了便利的使用條件,同時當請求與自定義路由約束匹配時咱們還能夠動態爲其添加,修改路由參數,控制跳轉等操做,注意約束條件必須繼承IRouteConstraint,而且實現Match方法。ip

時間倉促,代碼及文章比較雜亂,有什麼出錯的地方歡迎指出。

相關文章
相關標籤/搜索