cors error

Blade 未结 1 23

一、该问题的重现步骤是什么?

前端rider(h5)-》蒲公英局域网-》后端bladeboot

前端rider(h5)是新添加的一个客户端,相关信息如截图:image.png


image.png

A:前端项目在开发者工具里面能够正常访问所有后端的接口,鉴权与放行都能生效。

B:浏览器访问则出现跨域(前端devurl、代理、后台放行、nginx代理、能想的都想了,不知道在本地开发环境中如何解决这个跨域问题)

1、前端页面通过浏览器访问:则所有接口都提示跨域

2、修改后端BladeConfiguration 方法取消cors的路由image.png

前端页面在浏览器重新访问,所有接口都可以正常访问,未出现跨域问题,但是所有接口都不鉴权了。

3、修改image.png配置路径h5变为其他不存在路径,但应该鉴权的接口却出现跨域,无需鉴权的接口能正常访问。

二、你期待的结果是什么?实际看到的又是什么?

出现跨域,请求被两次请求分别都变成OPTION类型的请求,一个提示cors error 403 跨域,一个提示401

希望能够在本地开发环境中,浏览器访问前端页面能够正常调用api接口,不出现跨域问题,该鉴权的依旧鉴权,放行鉴权依旧生效


三、你正在使用的是什么产品,什么版本?在什么操作系统上?

bladexboot,4.8.0,开发本地环境macos

四、请提供详细的错误堆栈信息,这很重要。

7ba4179d8fde357be441eaee14366f71.png

image.png

五、若有更多详细信息,请在下面提供。

该问题困扰许久,到目前都无法缩小方向,麻烦帮我梳理下问题,快速定位原因。谢谢

1条回答
  • 跨域问题通过nginx来配置,部署rider的时候,给rider的nginx配置对应的反代理,这样就自动解决跨域问题了,和web端逻辑一致。


    如果无法给他配置工程内的反代,要独立的话,可以单开一个nginx,反向代理后端接口给rider直连,解决跨域的配置如下

        location /api {
            
            # 隐藏后端返回的 CORS 头部
            proxy_hide_header 'Access-Control-Allow-Origin';
            proxy_hide_header 'Access-Control-Allow-Methods';
            proxy_hide_header 'Access-Control-Allow-Headers';
            proxy_hide_header 'Access-Control-Allow-Credentials';
            proxy_hide_header 'Access-Control-Expose-Headers';
            proxy_hide_header 'Access-Control-Max-Age';
            
            # 所有非OPTIONS请求的CORS头部
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'DNT,X-Requested-With,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,token,Blade-Auth,Blade-Requested-With,Tenant-Id' always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
            
            
            # 处理OPTIONS预检请求
            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
                add_header 'Access-Control-Allow-Headers' 'DNT,X-Requested-With,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,token,Blade-Auth,Blade-Requested-With,Tenant-Id' always;
                add_header 'Access-Control-Max-Age' 3600;  # 预检请求的缓存时间
                add_header 'Content-Length' 0;
                add_header 'Content-Type' 'text/plain charset=UTF-8';
                return 204;  # 返回204响应,表示成功,但不返回数据
            }
            
            # 原来的代理配置
            proxy_redirect              off;
            proxy_set_header            Host $host;
            proxy_set_header            X-real-ip $remote_addr;
            proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass                  http://127.0.0.1:8800/;
        }


    0 讨论(0)
提交回复