springboot+vue前后端分离多次请求sessionid不同的解决方法

  • Post author:
  • Post category:vue


背景:我的项目中有一个发送邮箱验证码和检验的功能,通过redis,以sessionid为键,随机验证码为值,但是我发现获取验证码和点击注册时检验验证码的sessionid总是不同,在页面检查中选择网络发现set-cookie后面有一个黄标显示:“Set-Cookie没有指定“SameSite”属性,它被默认为“SameSite=Lax”,并被阻止,因为它来自一个cross-site响应,而不是对top-level导航的响应。Set-Cookie必须设置为“SameSite=None”才能启用cross-site用法”。问题原因是前后端跨域。

过程:在网上寻找解决方法的过程中我发现了一下几种方法:

1.在vue中添加

axios.defaults.withCredentials = true

没有解决问题

2.在springboot中添加

 private CorsConfigurationSource configuration(){
        CorsConfiguration configuration=new CorsConfiguration();
        //允许所有的请求,只能用于测试,非常危险
        configuration.addAllowedOriginPattern("*");
        configuration.addAllowedHeader("*");
        configuration.addAllowedMethod("POST");
        configuration.addAllowedMethod("GET");
        //允许携带cookie
        configuration.setAllowCredentials(true);
        configuration.setMaxAge(3600L);

        UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",configuration);
        return source;
    }

依然没有解决问题

3.通过chrome://flags/更改浏览器设置,后来发现新版本chrome没有给出相关设置, 也没有成功

4.关闭csrf,依然没有解决问题

5.使用Web相关配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    //解决前后端分离跨域问题,并没有解决
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")//设置允许跨域的路径
                .allowedOrigins("http://127.0.0.1:8080")//设置允许跨域请求的域名
                .allowCredentials(true)//是否允许证书 不再默认开启
                .allowedMethods("GET", "POST", "PUT", "DELETE")//设置允许的方法
                .maxAge(3600);//跨域允许时间
    }

}

依然没有解决问题

最后:我询问chatgpt:“怎么在spring security中设则Samesite = None Secure->”,再根据自身代码不断追问终于得到了答案



application.yml

文件中配置:

server:
  servlet:
    session:
      cookie:
        http-only: true
        secure: true
        same-site: none

最终解决了问题



版权声明:本文为weixin_53281846原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。