CHN-05-过滤器

过滤器(filter)可以帮助用户提高编程效率,在HttpController的例子中,getInfo方法在返回用户信息之前应该先校验用户是否登录,我们把这个逻辑写在getInfo方法里当然是可以的,但是,很显然,校验用户登录属于通用逻辑,很多接口都将用到,应该把它单独提取出来,再配置到调用handler之前,这就是filter的作用。

drogon框架做完URL路径匹配后,会先依次调用注册到该路径上的过滤器,只有当所有过滤器都允许"通过"时,对应的handler才会被调用;

内置过滤器

drogon内置了如下常用过滤器:

  • drogon::IntranetIpFilter:只放行内网ip发来的http请求,否则返回404页面;
  • drogon::LocalHostFilter:只放行本机127.0.0.1或者::1发来的http请求,否则返回404页面;

自定义过滤器

当然,用户可以自定义过滤器,需要继承HttpFilter类模板,模板类型就是子类类型,比如我们想做一个LoginFilter,就可以定义如下:

class LoginFilter:public drogon::HttpFilter<LoginFilter>
{
public:
    virtual void doFilter(const HttpRequestPtr &req,
                          FilterCallback &&fcb,
                          FilterChainCallback &&fccb) override ;
};

你可以通过 drogon_ctl 命令创建过滤器, 见 drogon_ctl.

我们需要重载父类的doFilter虚函数实现过滤器逻辑;

这个虚函数有三个参数,分别是:

  • req: http请求;
  • fcb:过滤器回调函数,函数类型是void (HttpResponsePtr),当过滤器判定请求不合法时,通过这个回调把特定的响应返回给浏览器;
  • fccb:过滤器链回调函数,函数类型是void (),当过滤器判定请求合法时,通过这个回调告诉drogon调用下一个过滤器或者最终的handler;

具体的实现可以参考drogon内置过滤器的实现。

过滤器的注册

过滤器总是伴随controller的注册进行,前面提到的注册handler的宏(PATH_ADD,METHOD_ADD等)都可以在最后添加一个或多个过滤器名字;比如,我们把前面getInfo方法的注册行改为如下形式:

METHOD_ADD(User::getInfo,"/{1}/info?token={2}",Get,"LoginFilter");

则在路径匹配成功后,必须满足如下条件,getInfo方法才会被调用:

  1. 请求必须是http get请求;
  2. 请求方必须已经登录;

可以看到,过滤器的配置和注册是非常简单的,注册过滤器的controller文件并不需要引用过滤器的头文件,过滤器和控制器也是充分解耦的。

注意: 如果过滤器定义在命名空间里,注册过滤器时必须把命名空间写全

06 视图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Drogon是一个基于C++14/17的Http应用框架,使用Drogon可以方便的使用C++构建各种类型的Web应用服务端程序。 本版本库是github上Drogon工程的镜像库。Drogon是作者非常喜欢的美剧《权力的游戏》中的一条龙的名字(汉译作卓耿),和龙有关但并不是dragon的误写,为了不至于引起不必要的误会这里说明一下。 Drogon是一个跨平台框架,它支持Linux,也支持macOS、FreeBSD,和Windows。它的主要特点如下: 1、网络层使用基于epoll(macOS/FreeBSD下是kqueue)的非阻塞IO框架,提供高并发、高性能的网络IO。详细请见TFB Tests Results; 2、全异步编程模式; 3、支持Http1.0/1.1(server端和client端); 4、基于template实现了简单的反射机制,使主程序框架、控制器(controller)和视图(view)完全解耦; 5、支持cookies和内建的session; 6、支持后端渲染,把控制器生成的数据交给视图生成Html页面,视图由CSP模板文件描述,通过CSP标签把C++代码嵌入到Html页面,由drogon的命令行工具在编译阶段自动生成C++代码并编译; 7、支持运行期的视图页面动态加载(动态编译和加载so文件); 8、非常方便灵活的路径(path)到控制器处理函数(handler)的映射方案; 9、支持过滤器(filter)链,方便在控制器之前执行统一的逻辑(如登录验证、Http Method约束验证等); 10、支持https(基于OpenSSL实现); 11、支持websocket(server端和client端); 12、支持Json格式请求和应答, 对Restful API应用开发非常友好; 13、支持文件下载和上传,支持sendfile系统调用; 14、支持gzip/brotli压缩传输; 15、支持pipelining; 16、提供一个轻量的命令行工具drogon_ctl,帮助简化各种类的创建和视图代码的生成过程; 17、基于非阻塞IO实现的异步数据库读写,目前支持PostgreSQL和MySQL(MariaDB)数据库; 18、基于线程池实现sqlite3数据库的异步读写,提供与上文数据库相同的接口; 19、支持ARM架构; 20、方便的轻量级ORM实现,支持常规的对象到数据库的双向映射操作; 21、支持插件,可通过配置文件在加载期动态拆装; 22、支持内建插入点的AOP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值