为什么IE10向同一站点发起两次请求时携带不同Cookie导致401错误
问题根因
该问题是IE10浏览器的原生Cookie处理缺陷导致,核心触发点有两个:
- IE10对同域名下不同路径下发的同名SESSION Cookie,不会按照路径最长匹配规则读取,会随机选择携带,导致两次请求携带的Cookie不一致
- IE10默认要求站点返回符合规范的P3P响应头才会持久化保存Cookie,未携带P3P头的响应返回的Cookie会被临时丢弃,后续请求会携带新生成的未授权Cookie
解决方案
1. SpringBoot侧统一SESSION Cookie配置
强制全局指定SESSION Cookie的根路径、属性,避免生成多份同名Cookie:
application.yml 配置方式
server: servlet: session: cookie: path: / http-only: true # HTTP站点设为false,HTTPS站点设为true secure: false max-age: 1800
代码自定义配置方式
@Bean public CookieSerializer cookieSerializer() { DefaultCookieSerializer serializer = new DefaultCookieSerializer(); serializer.setCookiePath("/"); serializer.setUseHttpOnlyCookie(true); // HTTPS生产环境请放开下面配置 // serializer.setUseSecureCookie(true); return serializer; }
2. 添加P3P响应头适配IE10
新增全局过滤器给所有响应添加兼容IE10的P3P头:
@Component public class IEP3PFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("P3P", "CP=\"CAO PSA OUR\""); chain.doFilter(request, response); } }
3. 前端AJAX请求适配(可选)
如果存在AJAX异步请求,给IE10下的请求开启withCredentials属性:
// 仅IE10生效 if (navigator.userAgent.indexOf("MSIE 10.0") !== -1 && window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); xhr.withCredentials = true; }
验证步骤
修改完成后清除IE10的所有缓存、Cookie数据,重启浏览器重复测试请求,确认两次请求携带的SESSION Cookie值完全一致即可。
内容的提问来源于stack exchange,提问作者baofeidyz
相关产品推荐
相关产品推荐

