royqh1979 / RedPanda-CPP

A light-weight C/C++ IDE based on Qt
GNU General Public License v3.0
996 stars 108 forks source link

关于从 OJ 网站下载数据集的 10045 端口的 POST 接口的跨域问题 #421

Open CornerSkyless opened 6 months ago

CornerSkyless commented 6 months ago

你好,我正在尝试在自己的 OJ 网站 (https://iai.sh.cn) 上集成一个功能,可以直接打开小熊猫 C++ 进行调试,我仿照了 competitive-companion 插件的方式,在网页上直接向本地的 10045 端口发送请求,但是由于处在浏览器环境下,会遇到跨域问题导致无法发送,不知道有没有可能在 http 监听处关闭跨域限制。

image

image

XY0797 commented 3 months ago

你好,我正在尝试在自己的 OJ 网站 (https://iai.sh.cn) 上集成一个功能,可以直接打开小熊猫 C++ 进行调试,我仿照了 competitive-companion 插件的方式,在网页上直接向本地的 10045 端口发送请求,但是由于处在浏览器环境下,会遇到跨域问题导致无法发送,不知道有没有可能在 http 监听处关闭跨域限制。

image

image

这个不是小熊猫C++的问题,跨域是浏览器的行为,与你要访问的目标服务器没啥关系,与你的网站服务器有关系

请你在你网站的服务器端添加跨域头信息

以下为nginx的配置示例:

# 添加跨域头信息
add_header 'Access-Control-Allow-Origin' 'http://localhost:10045';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';

但是这种跨域不能跨越http与https,你的网站是https会导致生产环境下用户无法正常使用该功能

我的建议是你额外弄个其它端口开http作为打开小熊猫的接口,然后https的页面通过打开新标签页跳转到http网页(避免跨域),需要的参数则通过get参数携带过去

window.open("http://iai.sh.cn:18485/RedPandaCPPOpen?param1=xxxxx&param2=xxxxxxx","_blank")

然后http后端把用户代码解码url并且嵌入到网页模板内,返回一个载入完成后就发送post请求的网页

前面说的跨域头就仅添加到http接口上,原站就不用改了

CornerSkyless commented 3 months ago

你好,我正在尝试在自己的 OJ 网站 (https://iai.sh.cn) 上集成一个功能,可以直接打开小熊猫 C++ 进行调试,我仿照了 competitive-companion 插件的方式,在网页上直接向本地的 10045 端口发送请求,但是由于处在浏览器环境下,会遇到跨域问题导致无法发送,不知道有没有可能在 http 监听处关闭跨域限制。 image image

这个不是小熊猫C++的问题,跨域是浏览器的行为,与你要访问的目标服务器没啥关系,与你的网站服务器有关系

请你在你网站的服务器端添加跨域头信息

以下为nginx的配置示例:

# 添加跨域头信息
add_header 'Access-Control-Allow-Origin' 'http://localhost:10045';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';

但是这种跨域不能跨越http与https,你的网站是https会导致生产环境下用户无法正常使用该功能

我的建议是你额外弄个其它端口开http作为打开小熊猫的接口,然后https的页面通过打开新标签页跳转到http网页(避免跨域),需要的参数则通过get参数携带过去

window.open("http://iai.sh.cn:18485/RedPandaCPPOpen?param1=xxxxx&param2=xxxxxxx","_blank")

然后http后端把用户代码解码url并且嵌入到网页模板内,返回一个载入完成后就发送post请求的网页

前面说的跨域头就仅添加到http接口上,原站就不用改了

你好,我想可能你误解了我的意思,跨域确实是浏览器行为,但解决跨域问题也确实需要被访问的服务端开放限制来解决。这个跨域拦截是发生在我调用本地 localhost 的小熊猫的 10045 端口时发生的,此时小熊猫才是服务端。因为我需要将请求参数(题目的一些信息)告诉小熊猫,所以参照了competitive-companion插件的操作方式,向小熊猫 10045 端口发送了数据包。

我可以通过在本地搭建 nginx 服务器做请求转发来规避,但这个功能是希望开放给所有用户使用的,并不能要求所有用户的本地开设一个转发服务器。所以还是麻烦开发者有时间可以留意一下这个问题。