浏览器控制台报 Response to preflight request doesn’t pass access control check,Network 面板里那条 OPTIONS 请求的状态码是 401,正式请求根本没发出去,接口在服务端看一次都没进来过。日志里能对上时间点,这种反而好排。
鉴权过滤器排在跨域前面,OPTIONS 请求不带 Authorization 头,直接判成未登录返回 401,预检过不去,后面的请求一个都发不出,前端只看到跨域,看不到真正原因。这一点先确认清楚,后面就不用反复试。
curl -i -X OPTIONS http://127.0.0.1:9000/api/user # 期望 204 且带 access-control-allow-origin 响应头
这次卡住的地方就在「网关 OPTIONS 预检」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:把跨域过滤器的顺序调到鉴权之前,用 @Order 显式指定;在鉴权逻辑里直接放行 OPTIONS 方法,不要让它进入 token 校验流程;确认预检的响应头里带齐 Allow-Methods 和 Allow-Headers 这些字段,缺一个浏览器就不放行。
结果对不对很好判断,OPTIONS 返回 204 且跨域响应头齐全,浏览器控制台不再报预检失败,正式请求能发出去。
