问题
登录改造的时候部署在测试环境页面登录流程正常,但是部署在正式环境时,发起登录请求之后页面直接跳转到后端登录的API接口返回数据页面:
通过查看日志,前端发起的登录接口报错,提示错误nodejs.JSONResponseFormatError: Unexpected token < in JSON at position 0。
根据图里的日志信息可以看到,访问http://XXX 时被重定向了https://XXX 只有协议不同,其他访问接口名 都一样!!
查看network的这个请求,status code是302 Found
但是按公司的登录流程是前端发起登录请求---> node接收此请求----> node通过整合接口信息向后端发起curl登录请求,所以按正常的登录流程访问真正的后端登录API是不会显示在页面的network上的(因为是node服务器转发了而不是页面直接请求的)
根据以上的现象,基本上对问题的原因有了一定的结论。node服务器发起curl (http)请求--->后端服务器返回302--->node重定向到302的Location url(https)。
由于服务器返回的是HTML格式(重定向页面)的数据,而非JSON,导致在解析JSON时出错,抛出了“JSONResponseFormatError”。
恍然大悟!以前也遇到过http重定向https的相关问题!!所以首先了解下302 Found。
什么是HTTP错误码302 Found
HTTP错误码302 Found是表示请求的资源已被临时移动到另一个位置。当客户端发送请求时,服务器会返回302状态码和一个Location头部,指示客户端应该重定向到的新位置。302 Found的特点是临时性重定向。它告诉客户端请求的资源已被暂时移动到另一个位置,服务器返回一个状态码和一个新的URL,告诉客户端应该去请求新的URL。相比之下,301 Moved Permanently是永久性重定向,表示请求的资源已被永久移动到新位置。
为什么会出现302 Found错误
- 网站配置为强制使用 HTTPS:许多网站通过配置(如在服务器设置或使用内容管理系统插件)强制将所有 HTTP 请求重定向到 HTTPS。这是一种常见的安全措施。
- 负载均衡器或反向代理设置:使用负载均衡器或反向代理的部署通常在这些中间层配置自动将 HTTP 请求重定向到 HTTPS。
- 应用程序逻辑要求:某些应用程序特定的逻辑可能要求将非安全连接重定向到安全连接,这通常在代码层面完成。
最后
找出罪魁祸首,登录api改成https即可!