首页 > 其他分享 >drogon跨域问题和全局异常处理

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

时间:2024-06-20 12:31:39浏览次数:26  
标签:Control const 跨域 val resp Access 全局 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();

刚开始只写了 registerPostHandlingAdvice的处理发下不行,然后参看看
https://github.com/drogonframework/drogon/issues/2014

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

标签:Control,const,跨域,val,resp,Access,全局,drogon
From: https://www.cnblogs.com/zx-admin/p/18258434

相关文章

  • OpenCL中局部变量和全局变量间的异步复制内存
    本文主要是async_work_group_copy(...)和wait_group_events(...)的使用范例。展示了从全局内存到局部内存加载数据和从局部内存到全局内存写入数据。这系列内置函数可以用来取代直接赋值式的代码。不过我没有仔细对比过使用异步复制和直接赋值那个效率更高。本系列函数中还有定步......
  • Vue3如何绑定全局方法和变量
    Vue2中Vue.prototype绑定全局方法,此写法在Vue3已经不存在了。与任何全局的东西一样,应该谨慎使用。Vue3使用provide/inject或者app.config.globalProperties进行绑定如果全局属性与组件自己的属性冲突,组件自己的属性将具有更高的优先级。 一、provide/inject方法......
  • 从局部到全局:产品开发视角的转变与系统优化策略
    一、研发背景在科技产品开发领域,每一种产品都存在着多元化的开发方案可供选择,这要求开发者不断拓展视野,进行横向对比学习,以期找到最贴合市场需求、最具竞争优势的解决方案。以往,我们的研发团队一直立足于稳固而成熟的硬件平台之上,倾注心力专攻电机控制软件开发,积累了丰富的专......
  • BizDevOps全局建设思路:横向串联,纵向深化
    本文来自腾讯蓝鲸智云社区用户:CanWayBizDevOps概述IT技术交付实践方法在不断迭代中持续优化。在工业化时代,Biz(业务)、Dev(开发)、Ops(运维)三者往往相对分离,甚至有时只有其中的两者或仅有一者独立存在。然而,随着时代的演进,互联网化时代带来了敏捷的先进思想,推动了业务与技术的初步......
  • 【Error】全局异常处理器
    定义全局异常处理器非常简单,就是定义一个类,在类上加上一个注解@RestControllerAdvice,加上这个注解就代表我们定义了一个全局异常处理器。在全局异常处理器当中,需要定义一个方法来捕获异常,在这个方法上需要加上注解@ExceptionHandler。通过@ExceptionHandler注解当中的value属性......
  • iframe实现跨域通信的方法
    在前端开发中,我们经常会遇到跨域通信的问题。跨域通信是指在浏览器的同源策略下,不同源之间的通信。本文将介绍如何通过iframe实现跨域通信,以及不跨域通信的方法和代码示例。引言跨域通信是指在浏览器的同源策略下,不同源之间的通信。同源策略是浏览器最核心的安全功能之一,它......
  • 关于跨域
    VS2022(.NET8)中对跨域的设置如下:1namespaceWebApplication12{3publicclassProgram4{5publicstaticvoidMain(string[]args)6{7varbuilder=WebApplication.CreateBuilder(args);89builder.Se......
  • 盘点 Spring Boot 解决跨域请求的几种办法
    熟悉web系统开发的同学,对下面这样的错误应该不会太陌生。之所以会出现这个错误,是因为浏览器出于安全的考虑,采用同源策略的控制,防止当前站点恶意攻击web服务器盗取数据。01、什么是跨域请求同源策略,简单的说就是当浏览器访问web服务器资源时,只有源相同才能正常进行通信,即......
  • React+TS前台项目实战(九)-- 全局常用组件弹窗Dialog封装
    文章目录前言Dialog公共弹窗组件1.功能分析2.代码+详细注释3.使用方式4.效果展示总结前言今天这篇主要讲全局公共弹窗Dialog组件封装,将用到上篇封装的模态框Modal组件。有时在前台项目中,偶尔要用到一两个常用的组件,如弹窗,其实不必非安装ant-design这些主流框......
  • C/C++ 全局对象注意事项
    在C/C++中,全局对象是指在所有函数外部定义的对象,它们在整个程序生命周期内都是存在的。全局对象有一些特殊的注意事项,下面将详细总结:初始化顺序:全局对象的构造函数在程序开始执行之前就会被调用,这意味着它们会在任何函数(包括main函数)之前被初始化。因此,必须确保全局对象的......