JavaScript应用连接ArcGIS Server的认证跨域问题求助
解决ArcGIS REST API跨域认证的几种可行方案
嘿,我之前做ArcGIS相关项目时也碰到过一模一样的跨域cookie问题,给你几个实际能用的解决办法,你可以根据自己的场景选:
直接在请求URL中附加Token
这是最快速的 workaround,既然浏览器不让跨域写cookie,那咱们就不用cookie传token。把你获取到的token直接作为参数拼在请求URL里就行,修改你的代码如下:// 假设你已经通过API拿到了有效的token let token = "your-obtained-token"; let url = `http://domain/arcgis/rest/services/${serviceName}/MapServer/${layer_id}/query?f=json&where=1%3D1&returnGeometry=false&outFields=*&token=${token}`;记得要处理token过期的情况,比如在请求前检查token有效期,过期了就重新获取。这种方式完全绕开了cookie的限制,不需要调整任何服务器配置。
配置ArcGIS Server开启CORS支持
如果你的ArcGIS Server是自己可控的,那推荐直接配置CORS,从根源解决跨域问题:- 登录ArcGIS Server Manager
- 进入「站点」→「安全」→「CORS」设置页面
- 添加你的前端应用所在的域名(本地开发的话可以加
http://localhost:xxxx,线上环境加正式域名) - 保存配置后,你的
xmlhttp.withCredentials = true就能正常生效,浏览器会允许跨域请求携带cookie,认证流程就能正常走了
搭建代理服务器转发请求
要是没法修改ArcGIS Server的配置,那就整个代理服务器当中间层。前端先把请求发给代理,代理再转发给ArcGIS Server,这样就不存在跨域问题了。
比如用Node.js写个极简代理:const express = require('express'); const { createProxyMiddleware } = require('http-proxy-middleware'); const app = express(); app.use('/arcgis-proxy', createProxyMiddleware({ target: 'http://domain/arcgis', changeOrigin: true, pathRewrite: { '^/arcgis-proxy': '' } })); app.listen(3000, () => console.log('Proxy server running on http://localhost:3000'));然后前端请求改成指向代理地址:
let url = `http://localhost:3000/arcgis-proxy/rest/services/${serviceName}/MapServer/${layer_id}/query?f=json&where=1%3D1&returnGeometry=false&outFields=*`;代理服务器和ArcGIS Server之间没有跨域限制,能正常处理cookie认证,前端也不用再担心跨域问题。
内容的提问来源于stack exchange,提问作者Leeloo




