项目背景

前端:VUE
后端:Java JDK 1.8 Springboot 1.5.12 maven 3.3.9
服务器环境:Linux nginx
数据库:mysql

车祸现场

1、废话不说直接上干货
仔细一点可以看出,No ‘Access-Control-Allow-Origin’ header is present on the requested resource.响应头中没有Access-Control-Allow-Origi参数。看一下响应头:
在这里插入图片描述

解决问题

楼主,查了下资料,应该是跨域的问题,因为我们的项目是前后分离的,那就从后台代码开始检查,首先看到跨域的配置
在这里插入图片描述①响应头中配置了,报错中缺少的Access-Control-Allow-Origin参数。
②实现拦截器方法之一,实现 HandlerInterceptor 接口。如果你还不了解
拦截器可以先看一下:https://blog.csdn.net/zhibo_lv/article/details/81699360 (这个博主写的还挺好的很详细)

这里先废话两句,首先定位到问题以后,我们先判断问题可能会出现的地方,这里我们定位到了后台的拦截器,发现响应头中,添加了报错缺少的Access-Control-Allow-Origin参数。那么会不会是这个参数有问题,我们接着排查一下配置项:
在这里插入图片描述
此处省略setget方法,继续看配置:

在这里插入图片描述
①允许访问的域名or Ip+port
②允许访问的方法
配置也都有,那么接下来看看启动的时候有启动注入的类:

在这里插入图片描述
该有的都有了,那么为什么还是访问的时候,报跨域的问题,我们在请求进入controller之前执行的拦截器preHandle方法中加入打印语句(验证请求是否进入的拦截器):

在这里插入图片描述
通过查看服务器日志,发现并:

在这里插入图片描述①我们想要的白名单域名都在
②No mapping found for HTTP request with URI [/virtualofficerapi/api/virtual/getCommentByScoreResult] in DispatcherServlet with name 'dispatcherServlet’是不是很眼熟, 发现错误问题了?是不是觉得根本没有这个url的映射,(接下来就要仔细去排查controller的@RequestMapping看看有没有拼写错误or大小写错误,这里楼主就不上图了,楼主的都是ctrl+c ctrl+v的没有问题),那么RequestMapping都没有问题,我们只能怀疑一个问题就是启动项目的项目名context-path
本人的项目是spring boot的 以jar包的方式启动,有两处配置了启动项目的context-path如下
①项目中yml配置文件:
在这里插入图片描述
②shell启动脚本,指定context-path

在这里插入图片描述这里可以看出,就算是项目中写了context-path,通过shell脚本启动项目的时候,项目的根路径就会变成"/",这个时候,前端访问后端的接口的时候地址会带着项目名,接着就会报跨域的错误,具体为什么楼主也不知道,也很想知道,谁能给我解释下,这里谢谢了!

接下来我们看一下项目启动的日志就明白了:
服务器启动日志:

在这里插入图片描述①即使项目中写了 context-path: /virtualofficerapi 启动后 WebApplicationContext 依然是 [/]
本地启动:

在这里插入图片描述①本地项目启动后 WebApplicationContext 依然是 [/virtualofficerapi]

改掉shell脚本启动的命令,加上virtualofficerapi就ok了~~~!!!

总结

①、找问题一定要冷静,不要心急。
②、一定要保持对应的配置的一致性,一致性、一致性。
③、授人以鱼不如授人以渔,授人以渔不如授人以渔夫。感谢这个过程中,给与楼主帮助的大神们。


我爱你
我希望你能够把自己挂在货架上
因为淘宝承认过
淘宝淘你所爱

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐