跨域请求总报错,浏览器突然说不,服务器怎么配合。
今天写代码又遇到跨域问题。明明调的是公开接口,页面就是报错。后来发现是因为不同域名访问被系统拦截了。这个叫CORS的机制真坑,搞不懂为啥有时候通有时候不通。但仔细看规则还是有门道的。
浏览器默认不让跨站拿数据。比如说你在A网站访问B网站的API,这时候浏览器会拦着。原因是要防恶意网站偷偷拿你的登录信息。要是没这个规则,逛个网页说不定钱就被转走了。所以这个安全机制其实有必要。
服务器得主动说清楚谁能访问。如果B网站同意A网站来读数据,就在返回头里写清楚。比如加个"Access-Control-Allow-Origin: https://a.com"。这样浏览器看到匹配了才会放行。要是写成星号允许所有人,反而可能有风险。
有些操作需要先问问行不行。比如发PUT或PATCH请求,得先发个 OPTIONS 请求试探。服务器得回答允许哪些方法和参数。要是没这个预检查环节,直接发请求大概率失败。
带cookie的时候更麻烦。默认情况下跨域请求不会带cookie。如果必须带,得在代码里开开关,并且服务器必须明确允许。否则即使同个用户也登录不上。
最近遇到奇怪问题,明明设置对了头信息还是不行。后来发现是服务器端cache缓存了旧配置。清一下再试就好了。有时候错别字也会导致整个配置失效。
遇到跨域报错先查浏览器控制台的具体提示。看是哪个头没配好。接着对比请求域名和服务器允许列表。搞不定就重启服务器或者清缓存试试。
现在遇到问题先别急着骂系统。按照流程一步步检查,大部分都能解决。毕竟系统设置这些限制,本意还是保护用户数据安全。
