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();路由上得加上 optionsADD_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做了跨域处理,还是不行的,本地测试还是有跨域问题