Beetlex服务框架之Webapi访问限制和url重写

在新版本的BeetleX.FastHttpApi中集成了IP访问策略和URL重写两个功能,通过IP访问策略可以制定服务针对不同IP的访问限制控制;而URL重写则可以制定更好的URL访问方式。以下介绍这两的功能的使用:

IP策略

组件在1.6.7开始集成了IP限制功能,可以通过配置白名单或黑名单的方式来配置可访问的IP。该功能默认情况是禁用,如果有需要则打开此功能来对访问进行限制(该功能暂只对IPv4有效,IPv6则暂时无效)。

配置

可以通过HttpApiServer.IPv4Tables.Type配置IP访问限制,默认值是None不开启,配置Black开启默名单限制,所有在黑名单中的IP不能访问服务;配置White开启白名单,所有在白名单中的IP才能访问服务。可以通过以下方法来添加IP

  • AddWhite方法添加白名单IP

HttpApiServer.IPv4Tables.AddWhite("192.168.2.1/24","192.168.1.18");
  • AddBlack方法添加黑名单IP

HttpApiServer.IPv4Tables.AddBlack("192.168.2.1/24","192.168.1.18");

配置文件

可以通过文件来配置,在目录下编辑iptables.json(如果文件不存在自行添加)

{
  "Type": "White",
  "WhiteList": [ "192.168.2.1/24", "192.168.2.18" ],
  "BlackList": [ "192.168.2.1/24" ]
}
 

Url重写

通过Url重写可以提高Url访问友好性同时不需要调整原有服务的Url访问地址,组件在新版本对Url重写进行的优化调整,以支持更灵活的重写功能

配置

可以通过HttpApiServer.UrlRewrite.Add方法来添加Url重写规则.

  server.UrlRewrite.Add("/cate/{0}.html", "/index.html");

以上重写是把/cate/下面的所有html重写到index.html.

配置文件

如果不想通过写代码来完成,可以配置目录下的rewrite.json文件(不存在则自行添加)

[
  {
    "Url": "/cate/{0}.html",
    "Rewrite": "/index.html"
  }
]

详细描述

组件对Url重写的依据是BaseUrl基础访问路径进行匹配,匹配方式不匹分大小写。通过{name}来描述一个Url的可变部分,name是一个变量名,这个变量可以在重写Url部分使用,一个Url可以有多个变量描述.这些重写的变量都会被写入到HttpContext的请求数据中,更方便绑定到控制器参数上.

  • 示例一

        {
            "Url": "/api/customers/{count}",
            "Rewrite": "/customers/{count}"
        }
  • 示例二

        {
            "Url": "/api/{user}/{id}",
            "Rewrite": "/api/{user}?id={id}"
        }
  • 官方blog

            server.UrlRewrite.Add("/cate/{0}.html", "/index.html", "html")
                .Add("/search/{0}.html", "/index.html", "html")
                 .Add("/tag/{0}.html", "/index.html", "html")
                  .Add("/blog/{0}.html", "/blog.html", "html")
                  .Add("/photos/{0}.html", "/photos.html", "html");

以上是 http://ikende.com/blog/ 的一个重写规则,把分类,标签和查询都路由到index.html页面处理了。

动态重写

静态规则有时候很难满足应用的需要,因此组件HttpRequest提供UrlRewriteTo方法用于重写当前的请求Url。那什么时候使用动态重写呢?以下描述一个简单的场景来表述动态重写的作用,当一个API提供了一个V1版后又开发了V2版本,但希望用户在不改变Url基础规则的情况可以兼容两种版本的调用;出现这情况一般会想到在前置代理做一些转发规则来满足需求,但组件提供动态重写则可以满足这样的需求。

复制代码
    [Controller(BaseUrl = "Api")]
    public class Api
    {
        public object Hello(string name)
        {
            return $"hello {name} {DateTime.Now}";
        }
    }

    [Controller(BaseUrl = "/v2/Api")]
    public class ApiV2 : IController
    {
        public object Hello(string name)
        {
            return $"hello {name} {DateTime.Now} v2";
        }
        [NotAction]
        public void Init(HttpApiServer server, string path)
        {
            server.HttpRequesting += (o, e) =>
            {
                if (e.Request.BaseUrl.IndexOf("/api", StringComparison.OrdinalIgnoreCase) >= 0)
                {
                    if (e.Request.Data["version"] == "v2")
                    {
                        e.Request.UrlRewriteTo("/v2" + e.Request.Url);
                    }
                }
            };
        }
    }
复制代码

只需要在实现V2版本中对HttpRequesting进行一个监听并根据情况进行处理即可以;而V1的代码无须更改,已有的Url没有变化,只需要在新的调用中添加对应的版本描述即实现。

Url重写是BeetleX的webapi基础功能,因此对应的服务网关也可以定义相关url重写功能用于服务转发上.服务网关重写插件使用:https://github.com/IKende/Bumblebee/wiki/Url重写

posted @   beetlex  阅读(1054)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2013-10-24 asp.net mvc简单实现基于Razor的分页控件
点击右上角即可分享
微信分享提示