drogon跨域问题和全局异常处理

2024年6月20日12:21:11

在main.cc里加入

复制代码
 /**
     * 全局异常处理
     */
    drogon::app().setExceptionHandler([](
                                          const std::exception &e,
                                          const drogon::HttpRequestPtr &req,
                                          std::function<void(drogon::HttpResponsePtr &)> &&callback)
                                      {

        LOG_DEBUG << e.what();

        Json::Value json;
        json["code"] = FAIL;
        json["error"] = e.what();
        json["data"] = "";
        auto resp = drogon::HttpResponse::newHttpJsonResponse(json);
        callback(resp); });

    // 跨域
    drogon::app().registerSyncAdvice([](const drogon::HttpRequestPtr &req) -> drogon::HttpResponsePtr
                                     {
			if(req->method() == drogon::HttpMethod::Options)
			{
				auto resp = drogon::HttpResponse::newHttpResponse();
				{
					const auto& val = req->getHeader("Origin");
					if(!val.empty())
						resp->addHeader("Access-Control-Allow-Origin", val);
				}
				{
					const auto& val = req->getHeader("Access-Control-Request-Method");
					if(!val.empty())
						resp->addHeader("Access-Control-Allow-Methods", val);
				}
				resp->addHeader("Access-Control-Allow-Credentials", "true");
				{
					const auto& val = req->getHeader("Access-Control-Request-Headers");
					if(!val.empty())
						resp->addHeader("Access-Control-Allow-Headers", val);
				}
				return std::move(resp);
			}
			return {}; })
        .registerPostHandlingAdvice([](const drogon::HttpRequestPtr &req, const drogon::HttpResponsePtr &resp) -> void
                                    {
			{
				const auto& val = req->getHeader("Origin");
				if(!val.empty())
					resp->addHeader("Access-Control-Allow-Origin", val);
			}
			{
				const auto& val = req->getHeader("Access-Control-Request-Method");
				if(!val.empty())
					resp->addHeader("Access-Control-Allow-Methods", val);
			}
			resp->addHeader("Access-Control-Allow-Credentials", "true");
			{
				const auto& val = req->getHeader("Access-Control-Request-Headers");
				if(!val.empty())
					resp->addHeader("Access-Control-Allow-Headers", val);
			} })
        .run();

路由上得加上 options
 ADD_METHOD_TO(IndexController::getMenu, "/api/admin/getMenu", Options, Post, "LoginFilter");       // 获取菜单

下图显示了的位置,http请求处理期间的AOP连接点。
		
                         +-----------+                             +----------+
                         |  Request  |                             | Response |
                         +-----------+                             +----------+
                               |                                         ^
                               v                                         |
               sync join point o----------->[HttpResponsePtr]----------->+
                               |                                         |
                               v                                         |
        Pre-routing join point o----------->[Advice callback]----------->+
                               |                                         |
                               v         Invalid path                    |
                         [Find Handler]---------------->[404]----------->+
                               |                                         |
                               v                                         |
       Post-routing join point o----------->[Advice callback]----------->+
                               |                                         |
                               v        Invalid method                   |
                         [Check Method]---------------->[405]----------->+
                               |                                         |
                               v                                         |
                           [Filters]------->[Filter callback]----------->+
                               |                                         |
                               v             Y                           |
                      [Is OPTIONS method?]------------->[200]----------->+
                               |                                         |
                               v                                         |
       Pre-handling join point o----------->[Advice callback]----------->+
                               |                                         |
                               v                                         |
                           [Handler]                                     |
                               |                                         |
                               v                                         |
      Post-handling join point o---------------------------------------->+


      app.registerHttpSimpleController("/userinfo","UserInfoCtrl",{Get,"LoginFilter"});

刚开始只写了 registerPostHandlingAdvice的处理发下不行,然后参看看

https://github.com/drogonframework/drogon/issues/2014

发现还要增加 registerSyncAdvice去单独处理 Options,才行,如果你在nginx做了跨域处理,还是不行的,本地测试还是有跨域问题

相关推荐
努力实干2 小时前
面向对象设计原则——C++
开发语言·c++·数码相机
syagain_zsx5 小时前
jsoncpp 使用指南:编译链接、Json::Value 取值与高频坑
c++·json·库·http格式
布莱克6056 小时前
理解 = delete 与 = default:两种赋值语义的差异
c++
小小、码农7 小时前
[特殊字符]【C++11】类的新功能全面解析:移动构造、移动赋值、default、delete、final 与 override
linux·开发语言·网络·c++
库玛西7 小时前
外部排序全解析:败者树、置换-选择排序与最佳归并树
c语言·数据结构·c++·笔记·考研·算法
General_G9 小时前
创建型模式—原型(Prototype)模式
c++·设计模式·原型模式
syagain_zsx9 小时前
protobuf 实战:从 .proto 到 C++ 序列化的完整链路
c++·学习·程序人生·谷歌·protobuf
welfare96210 小时前
新号别搞:C++_list
开发语言·c++
xiaoye-duck10 小时前
《C++ 项目:手写大模型接入 SDK》云端 API 调用基础与 Apifox 调试实战
网络·c++·语言模型
坤坤子吖10 小时前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习