Angular JS 1.5.5无法读取XSRF-TOKEN Cookie问题咨询
遇到这种同域名下Angular没法自动处理XSRF Cookie的情况,大概率是服务端Cookie的属性设置不对,或者Angular的默认配置被意外覆盖了。我给你梳理几个排查和解决的关键点:
检查XSRF-TOKEN的HttpOnly属性
这是最常见的坑!如果服务端给这个Cookie设置了HttpOnly=true,浏览器会禁止JavaScript读取它,Angular的$http自然没法拿到值去设置请求头。你需要在服务端配置里把XSRF-TOKEN的HttpOnly设为false——毕竟这个Cookie就是专门给前端JS读取用的,不需要加HttpOnly保护。确认Cookie的Path和Domain属性
要是服务端设置的Cookie Path是某个子路径(比如/api),但你的前端部署在根路径/,那页面里的JS就访问不到这个Cookie。确保Cookie的Path设为/,Domain设为当前域名(或者留空让浏览器自动处理),这样整个域名下的页面都能拿到它。检查SameSite属性
如果Cookie的SameSite设为Strict,在某些场景下(比如从站内跳转过来的POST请求)可能会被限制。同域名下建议设为Lax或者None(如果需要兼容旧浏览器的话),避免浏览器拦截Cookie的读取。验证Angular的$http默认配置
虽然Angular默认会自动读取XSRF-TOKEN并设置X-XSRF-TOKEN请求头,但有时候自定义的拦截器或者配置会覆盖这个行为。你可以在应用的config阶段打印默认配置确认:angular.module('yourApp') .config(['$httpProvider', function($httpProvider) { console.log($httpProvider.defaults.xsrfCookieName); // 应该输出"XSRF-TOKEN" console.log($httpProvider.defaults.xsrfHeaderName); // 应该输出"X-XSRF-TOKEN" }]);如果这些值被修改了,改回默认值就能解决问题。另外,检查有没有自定义的HTTP拦截器,确保它没有移除或修改
X-XSRF-TOKEN请求头。手动测试Cookie可读性
打开浏览器控制台,输入document.cookie,看看输出里有没有XSRF-TOKEN。如果看不到,那肯定是服务端Cookie设置的问题,回到前面的步骤调整;如果能看到,那就是Angular这边的配置或拦截器有问题。
按照这个流程排查下来,基本能解决大部分同域名下的XSRF自动处理失败问题。
内容的提问来源于stack exchange,提问作者Sayan

