美文网首页
.net Mvc 程序通过Route拦截,实现网站白名单

.net Mvc 程序通过Route拦截,实现网站白名单

作者: 浅谈码生活 | 来源:发表于2020-12-29 16:27 被阅读0次

在实施路由拦截之前,通过下图先了解当请求到达Mvc程序后数据如何在管道中流动:


http请求.png

此过程将分为三步:

1.通过继承“RouteBase”来自定义用于我们自己的Route:

public class CustomRout : RouteBase
{
    //白名单集合
    List<string> hosts = new List<string>()
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        //通过“UserAgent”判断浏览器版本实施拦截
        //if (httpContext.Request.UserAgent.Contains("Mozilla/5.0 (Windows NT 10.0; Win64; x64)"))
        //{
            //return null;
        //}
       if (hosts.FindIndex(h => h == httpContext.Request.Url.Host) > 0) 
       {
              //不做拦截处理
              return null;
        }
        else
        {
            //跳转到指定页面
            var routData = new RouteData(this, new MvcRouteHandler());
            routData.Values.Add("controller", "Pipe");
            routData.Values.Add("action", "Refuse");
            return routData;
        }
    }
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        return null;
    }
}

注:下图是通过反编译源代码后,框架里创建Route方式,因此可以借鉴来创建自己的Route

创建Route.png

2.将自定义Route在“RouteConfig.cs”文件中进行注册:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)  //配置路由
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //忽略路由         
        routes.Add("chrome", new CustomRout());
        routes.MapRoute( //常规路由 
            url: "{controller}/{action}/{id}",
            name: "Default", //路由名称  被作为路由集合的Key  this[int index]  不能重复
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

3.Route匹配:


匹配路由.png

注:通过上面的代码将Route注册到RouteCollection集合中去后,框架会遍历该集合,一旦找到匹配Route,立即返回。

相关文章

网友评论

      本文标题:.net Mvc 程序通过Route拦截,实现网站白名单

      本文链接:https://www.haomeiwen.com/subject/eozfoktx.html