java 为什么尽管在服务器响应和CORS配置中设置了Cookie,但未随Axios请求发送Cookie?

rlcwz9us  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(139)

我正在开发一个Web应用程序,它在服务器端使用Java Spring,在客户端使用React。当用户登录时,服务器会在响应中发送一个cookie,客户端的后续请求预计会包含此cookie以进行身份验证。然而,cookie似乎没有随请求一起发送,我不确定为什么。
下面是设置set-cookie头的服务器端代码:

ResponseCookie cookie = ResponseCookie.from("my_cookie", "my_value")
  .httpOnly(true)
  .secure(false)
  .sameSite("lax")
  .build();
response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());

下面是发出刷新访问令牌请求的客户端代码:

axios.get('/api/v1/auth/refresh_token', { withCredentials: true })
  .then(response => console.log(response))
  .catch(error => console.error(error));

下面是设置CORS配置的服务器端代码:

public class CorsConfiguration {
    @Value("${navaship.webapp.url}")
    private String webAppUrl;

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                // Add the CORS configuration for the /api/v1/auth/refresh-token endpoint
                registry.addMapping("/api/v*/auth/refresh-token")
                        .allowedOrigins(webAppUrl)
                        .allowedMethods("GET")
                        .allowCredentials(true);

                registry.addMapping("/api/v*/**")
                        .allowedOrigins(webAppUrl)
                        .allowedMethods("GET", "POST", "PUT", "DELETE");
            }
        };
    }
}

我已经验证了服务器响应中的cookie设置正确,并且在/API/v1/auth/refresh-token端点的CORS配置中,allowCredentials选项设置为true。但是,当我在浏览器控制台中检查网络请求时,我没有看到请求头中发送的cookie。
是什么原因导致cookie不能随请求一起发送?我的代码或配置中是否缺少了什么?如有任何帮助,将不胜感激。

ssm49v7z

ssm49v7z1#

尝试删除.secure(true)
原因是.secure只允许cookie通过安全通道传输,即HTTPS。如果您在本地开发,则可能使用http,因此没有cookie。
还要记住,.httpOnly(true)会阻止你的js代码(所以你的react应用程序)访问cookie。所以如果你的js代码需要读取cookie值,你需要禁用它。

相关问题