问题描述

这里网易云音乐项目要获取推荐歌单,但是获取失败,原因是code:302。
error

原因如图所示:请求成功,返回200,但是并没有返回我想要的数据,而是告诉我302错误,什么都没有。

问题分析

开始我认为请求失败,错误代码302。

302是重定向错误,表示请求的资源被暂时转移到由该响应头location所指定的rul上了。

我对此表示疑问,在网上对该问题进行搜索,无意间看到了可能是axios导致的,这可能是一个跨域问题。

于是我修改了代码,输出一下http状态码:
1
第一行才是http响应码,200表明成功请求,但是并没有获取到数据,这时我想到可能是没有登录的原因,但是并不确定,因为我使

用浏览器直接访问地址localhost:3000/recommend/resource可以得到数据。

为了确认这个问题,我通过浏览器把网站数据清除,包括cookie
在这里插入图片描述
这次通过浏览器直接获取数据失败了,返回的和我项目结果一致,看来确实是没有登录的原因。但是还有疑问,直接浏览器获取

数据成功,是因为我之前测试过,在浏览器留下了cookie,cookie并没有过期,所以获取数据实际上是处于登录状态的,发送数据

时带有cookie。但是我项目测试的时候也登录过,也应该会有cookie,那为什么会失败?

前端获取不到cookie

于是我先登录在发送请求,结果还是不行,查看发现请求没有带上cookie。
login
这是我登陆后服务器响应返回的cookie,但是我使用document.cookie无法获取到cookie。

cookie
如上所示,这可能是因为httponly和secure:

  • httponly:document.cookie api无法访问带有httponly属性的cookie
  • secure: 设置为 Secure 的 cookie 只能通过被 HTTPS 协议加密过的请求发送过服务端。可以预防中间人攻击。

但是经过查看,并不是以上二者的原因。查看返回的数据并没有设置这两项。
3

这时我想到了axios的跨域问题,浏览器在请求时会自动带上cookie(如果有的话),但是在跨域的时候不会自动带上,使用axios

时需要额外配置 withCredential: true让axios跨域时携带cookie,配置之后终于成功获取到数据。

0

总结

其实这个问题完全可以避免的,在文档里有提过,但是我并没有仔细查看文件。在其次也是经验比较少,并没有直接发现问题的

根源。我们在做项目的时候还是要仔细一点。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐