cors跨域问题解决

golang后端框架gin如果设置了分组的group请求前缀,跨域有些不一样。

r1 := gin.Default()
	r := r1.Group("/game")
	webSocket := server.NewWebSocket()
	r1.NoRoute(cors.New(
		cors.Config{
			AllowOrigins: allowOrigins,
			AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"},
			AllowHeaders: []string{
				"*",
			},
			AllowCredentials: true,
			MaxAge:           12 * time.Hour,
		},
	))
	// websocket单独处理,正常http请求按照router.Register方式来写
	r.Use(
		cors.New(
			cors.Config{
				AllowOrigins: allowOrigins,
				AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"},
				AllowHeaders: []string{
					"*",
				},
				AllowCredentials: true,
				MaxAge:           12 * time.Hour,
			},
		),
	).Use(TraceIDHandler()).Use(timeoutMiddleware()).Use(gin.CustomRecovery(customRecoveryHandler)).
		Use(RequestUserInfo()).Use(RequestLogMiddleware()).Use(ResponseHeaderSet())
r.Group.POST(path, r.Handle)

通过查看

r.Group.POST(path, r.Handle)的源码得知:

func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes {
	absolutePath := group.calculateAbsolutePath(relativePath)
	handlers = group.combineHandlers(handlers)
	group.engine.addRoute(httpMethod, absolutePath, handlers)
	return group.returnObj()
}

如果写了

r.POST(path, r.Handle),则以上源码中的
group.engine.addRoute(httpMethod, absolutePath, handlers)
只会将post方法对应的跨域用的cors的handler来处理注册到engine中。而对于options方法的请求是不会用这个handlers来处理的。

如果想解决此问题,有两个方案:
1. 对于post/get等请求,不只是写

r.POST(path, r.Handle),而是增加r.OPTIONS(path, r.Handle),将options也写入到engine的处理的method中

2. 增加这个方法:

r1.NoRoute(cors.New(
    cors.Config{
       AllowOrigins: allowOrigins,
       AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"},
       AllowHeaders: []string{
          "*",
       },
       AllowCredentials: true,
       MaxAge:           12 * time.Hour,
    },
))

这是告诉engine。如果存在不理解的method。则用norout中定义的hanlder处理。那么我们这里定义了cors的hanlder方法。因为options没有在engine中注册过,因此会采用这个noroute中注入的hanler cors来处理。也满足条件。我在代码中就是用的这种方式

二. 进入cros的判断

如果前端发送请求时没有配置credentials: 'include'。则前端的header中即使有'Authorization': 'Bearer xxxx'头,浏览器依然不认为则是一个'带有凭据'的请求。

1. 如果不设置credentials: 'include',则后端设置AllowOrigins具体的域名,AllowHeaders设置为*,都可以通过跨域请求


但是如果如下设置:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>跨域测试页面</title>
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<h1>跨域测试</h1>
<div>
    <input type="button" οnclick="mySubmit()" value=" 发送跨域请求 ">
</div>
<script>
    function mySubmit() {
fetch("http://localhost:8082/game/v1/new_game", {
        method: "POST",
        credentials:"include",
        headers: {
            'Content-Type': 'application/json; charset=utf-8',
            'Authorization': 'Bearer xxxx'
        },
        body: JSON.stringify({"name": "Java"})
    })
    .then(response => response.json())
    .then(result => alert("返回数据:" + result.data))
    .catch(error => console.error('Error:', error));
    }
</script>
</body>
</html>

增加了credentials:"include",

根据cors的规范:

禁止在Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true的时候,前端发送带有凭据的请求能够通过cros。


2. 实际测试过程中发现会更严格;
即使设置了AllowOrigins,但是AllowHeaders设置为*。也是无法通过跨域请求的。

r1.NoRoute(cors.New(
    cors.Config{
       AllowOrigins: allowOrigins,
       AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"},
       AllowHeaders: []string{
          "*",
       },
       AllowCredentials: true,
       MaxAge:           12 * time.Hour,
    },
))

必须指定AllowHeaders。同时,不能只设置r1.NoRoute,对实际的post请求也要设置好,也就是

r.Use(也要对AllowHeaders进行指定。

3. 通过测试来看,似乎前端不增加 credentials:"include",的话,后端的

AllowHeaders选择通配符是能够跨域成功的。

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值