问题描述:当浏览器访问后台的时候无法携带cookie,导致后台无法收到cookie值,从而无法进行权限鉴定等操作。

问题发现:

  • 业务逻辑:后台在用户登录成功之后会生成UUID为Session的key;并添加Cookie:"token":UUID;当用户再次访问的时候需要获取token再获取session中的信息。但是当再次访问的时候获取不到cookie中的token。

判断出问题地方:

  1. 在登录后的浏览器的响应体中看到set-cookie:token:xxx 所以后端没为题;
  2. 在第二次访问的时候后端无法获取cookie,请求体中也没有发现token,所以问题在第一次请求返回和第二次请求之间;
  3. 使用其他浏览器尝试——可以,问题就是chrome了。(注意:使用axios时默认不携带cookie,需要设置axios.defaults.withCredentials=true使其携带cookie;比如我的项目中是在vue的登录组件处先设置,在使用axios发送请求。)

解决:经查阅资料发现是由于chrom浏览器开启了SameSite用于防止CSRF(跨域请求伪造),当关闭该选项之后即可。设置方式:

  • 地址栏输入:chrome://flags/

  • 搜索栏输入SameSite,得到如下:

  • 改为disable,并重启浏览器即可

跨域问题

其实造成这个原因还是因为跨域的原因。在本项目中前端使用vue,访问后台的时候就会出现跨域问题。
因为这里后台使用的是Springboot,所以使用了CORS来解决跨域问题。
Spring官方提供三种方式,详见官网解释

  1. 在方法或Controller上使用注解:@CrossOrigin
  2. 创建配置类实现WebMvcConfigurer接口并重写addCorsMappings方法
@Configuration
@MapperScan("com.zjj.spike_system.mapper")  //扫描包
public class WebConfig implements WebMvcConfigurer {

  /*
  * 配置跨域:也可以在Controller上使用    @CrossOrigin注解
  * */
  @Override
  public void addCorsMappings(CorsRegistry registry) {
      registry.addMapping("/**").allowedOriginPatterns("*").allowCredentials(true).allowedMethods("POST","GET","PUT","DELETE").maxAge(3600);
  }

3.使用CORSFilter过滤器

posted on 2021-11-14 20:37  wuraoo  阅读(2777)  评论(0编辑  收藏  举报