基于Rally网格的简易应用突发CORS跨域问题技术求助
遇到突然冒出来的CORS问题确实闹心,尤其是之前运行完全正常的应用。结合你给出的报错信息,咱们梳理几个靠谱的解决方向:
1. 确认Rally跨域白名单配置
Rally的Web Service会严格限制跨域请求的来源,很大可能是最近你的应用域名从Rally的允许列表中被移除,或者Rally更新了跨域策略。你需要:
- 登录Rally账户,进入应用管理或集成设置页面
- 找到跨域资源共享(CORS)相关的配置项
- 检查你的应用所在域名(比如
http://localhost:xxxx或者线上正式域名)是否在允许的Origin列表中,如果不在,手动添加进去
2. 排查请求头部与参数变化
对比之前正常运行时的请求,看看现在的请求有没有这些异常变化:
- 新增了自定义HTTP头部:额外的头部会触发浏览器发送OPTIONS预检请求,如果Rally服务器未配置允许这些头部,就会直接导致CORS失败。可以先去掉不必要的自定义头部试试
Origin头部是否正确:确保请求的Origin和你在Rally配置的白名单完全一致(包括协议、域名、端口,比如http://localhost:8080不能简写为http://localhost)- 请求参数是否合规:虽然报错是CORS,但有时候参数格式错误也可能间接引发跨域相关的服务器响应异常,检查
project这类关键参数是否完整有效
3. 切换到Rally官方SDK请求数据
如果你是用原生AJAX/fetch手动发起请求,建议换成Rally官方提供的JavaScript SDK,它已经封装了跨域请求的正确处理逻辑,能避免手动踩坑。比如用Rally.data.wsapi.Store来加载数据:
Ext.define('CustomApp', { extend: 'Rally.app.App', componentCls: 'app', launch: function() { this.add({ xtype: 'rallygrid', storeConfig: { model: 'HierarchicalRequirement', filters: [ {property: 'InProgressDate', operator: '>=', value: '2018-04-07'}, {property: 'DirectChildrenCount', operator: '=', value: 0} ], fetch: ['Name', 'FormattedID'], pageSize: 200 }, columnCfgs: [ 'FormattedID', 'Name' ] }); } });
官方SDK会自动处理跨域所需的头部和请求方式,大幅降低CORS问题的概率。
4. 检查浏览器CORS政策更新
部分浏览器(比如Chrome)会不定期更新CORS的严格程度,可能之前允许的请求现在被限制了。你可以:
- 用不同浏览器(比如Firefox)测试应用,看是否仍然报错
- 打开浏览器控制台的网络标签,查看OPTIONS预检请求的响应状态码和头部,确认是服务器拒绝了请求还是浏览器本地拦截
你的报错信息参考:
15:58:02.108 App-debug.html:1 Failed to load https://rally1.rallydev.com/slm/webservice/v2.0/HierarchicalRequirement?start=1&pagesize=200&query=((InProgressDate%20%3E%3D%20%222018-04-07%22)%20AND%20(DirectChildrenCount%20%3D%200))&fetch=Name%2CFormattedID&includePermissions=true&compact=true&project=%2Fproject%2F5262703...
内容的提问来源于stack exchange,提问作者Roland

