最近遇到了前端请求后端不带cookie的问题,
请求时header里面就是没有cookie
查看响应应该是这个问题
SameSite是一个cookie属性,用于控制浏览器是否在跨站点请求中发送cookie。它有三个可能的值:
1. Strict(严格模式)
在严格模式下,浏览器将不会在跨站点请求中发送cookie。这意味着这些cookie将仅用于同站点请求。这是默认设置。
2. Lax(宽松模式)
在宽松模式下,浏览器将仅在跨站点POST请求(例如表单提交)中发送cookie。任何跨站点请求(包括GET请求)都不会发送cookie。这可以提供一定程度的保护,同时允许一些常见的用例。
3. None(无限制模式)
在无限制模式下,浏览器将在所有跨站点请求中发送cookie。这是因为cookie的SameSite属性默认为Strict,需要明确设置为None来允许跨站点请求发送cookie。
SameSite属性的目的是防止跨站点请求伪造(CSRF)攻击。通过限制哪些请求可以发送cookie,可以减少攻击者对用户身份验证的滥用。
需要注意的是,SameSite属性对于旧版本的浏览器可能不起作用,因此应该采取其他措施来防止CSRF攻击。此外,SameSite属性也不会提供完全的保护,只能作为一种额外的安全层。
设置SameSite
// 设置Cookie的SameSite属性为None,并启用Secure标志
Cookie cookie = new Cookie("JSESSIONID", request.getSession().getId());
cookie.setPath("/");
cookie.setHttpOnly(true); // 保持HttpOnly属性以增强安全性
cookie.setSecure(true); // 必须在HTTPS环境下设置为true,因为SameSite=None要求安全上下文
cookie.setSameSite(Cookie.SameSite.NONE.getValue()); // 设置SameSite为None,注意这需要Servlet 5.0+支持
但是无法使用Cookie
中的方法 setSameSite
我正在使用的Java Servlet API版本不支持直接设置SameSite属性。Cookie.setSameSite()方法是在Servlet 5.0规范中引入的。如果你的项目依赖于早期版本的Servlet API,无法直接调用这个方法。
手动设置响应头来实现SameSite=None,同时确保设置Secure标志,因为大多数浏览器在SameSite=None时要求使用HTTPS。
在后端拦截器中加入下面代码显式配置响应头
String sessionID = request.getSession().getId();
response.setHeader("Set-Cookie", String.format("JSESSIONID=%s; Path=/; Secure; HttpOnly; SameSite=None", sessionID));
前端请求头成功携带cookie