HttpOnly cookies未在请求中发送

11

我想使用 HttpOnly cookies,并且在Java中进行如下设置:

...

Cookie accessTokenCookie = new Cookie("token", userToken);
accessTokenCookie.setHttpOnly(true);
accessTokenCookie.setSecure(true);
accessTokenCookie.setPath("/");
response.addCookie(accessTokenCookie);
Cookie refreshTokenCookie = new Cookie("refreshToken", refreshToken);
refreshTokenCookie.setHttpOnly(true);
refreshTokenCookie.setSecure(true);
refreshTokenCookie.setPath("/");
response.addCookie(refreshTokenCookie);

...

我已经收到了客户端发来的带有cookie的响应,但是当我发送下一个请求时,请求中没有包含cookie。也许我错过了什么,但是据我所知,这些HttpOnly的cookie必须由浏览器在每个请求(JavaScript无法访问这些cookie)中返回到定义路径。

我有以下请求头:

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8,hu;q=0.6,ro;q=0.4,fr;q=0.2,de;q=0.2
Authorization:Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Connection:keep-alive
Content-Length:35
content-type:text/plain
Host:localhost:8080
Origin:http://localhost:4200
Referer:http://localhost:4200/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
X-Requested-With:XMLHttpRequest

并且以下是响应头:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:4200
Access-Control-Expose-Headers:Access-Control-Allow-Origin, Content-Type, Date, Link, Server, X-Application-Context, X-Total-Count
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Length:482
Content-Type:application/json;charset=ISO-8859-1
Date:Fri, 03 Feb 2017 13:11:29 GMT
Expires:0
Pragma:no-cache
Set-Cookie:token=eyJhbGciO;Max-Age=10000;path=/;Secure;HttpOnly
Set-Cookie:refreshToken=eyJhb8w;Max-Age=10000;path=/;Secure;HttpOnly
Vary:Origin

在客户端中,我在Angular2中使用 withCredentials: true,并且将请求头设置为X-Requested-With:XMLHttpRequest

并且这是跨域。


嗨!我遇到了同样的问题。当我移除HTTP only标志时,它就可以工作了。你找到其他解决方法了吗? - Nirav Shah
通过从 cookie 中移除安全标志,解决了问题。 - István
非常感谢!!它有效了。 - Nirav Shah
1个回答

4

是的,你说得对。如果浏览器拥有cookie并且其未过期,那么它应该自动发送cookie。httpOnly标志意味着无法通过JavaScript访问或操作cookie。

然而

你需要确保发送的cookie不是跨域的。如果你需要跨域发送cookie,则需要以不同的方式处理。


是的,这是一个跨域cookie,我该如何处理它? - István
1
就您的情况而言,我建议使用JWT和头文件。但是如果您必须使用跨域Cookies,请尝试查看 https://dev59.com/E3A75IYBdhLWcg3wW3oZ - Robert Leggett
1
通过从Cookie中删除“Secure”标志,解决了该问题。 - István

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接