摘要:@CrossOrigin注解没有生效在网上找了好多解决办法也都是很分散,今天将大多数的决绝办法总结一下。
一:跨域(CORS)支持
Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它。所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin
二:@CrossOrigin注解的使用位置
1)在controller类上使用,对所有controller中的所有方法都生效
1 |
|
三:在Controller中的方法上使用,只对该方法生效
1 |
|
四:使用@CrossOrigin注解后不能跨域访问的解决办法
1)情况一:在方法上使用@CrossOrigin注解,但@RequestMapping注解中没有指定Get、Post方式,通过method = RequestMethod.POST/GET指定或者指定@CrossOrigin注解中的methods = {RequestMethod.POST}后,问题解决。
1 | #在@CrossOrigin中methods指定方式 |
原因:这里的注释已经解释了该方法会重写RequestMapping注解的方法,如果没有定义则使用RequestMapping注解的方法,所以在你不写@RequestMapping(method = {RequestMethod.POST})中的额method而@CrossOrigin中也没有定义所以无效喽
1 | #观察@CrossOrigin中的解释 |
2)情况二:跨域访问响应状态码是405-Method Not Allowed,请求行中指定的请求方法不能被用于请求相应的资源。原因很明显,就是请求不正确,检查代码,使用正确的方式请求。这个就不上图了,这属于粗心大意
3)情况三:查看springboot版本,如果是2.0以后版本,allowCredentials属性的默认值为false,返回的响应头AccessControlAllowCredentials属性值也为false,如果客户端携带cookie的请求这时是不能跨域访问的,所以需要手动在注解中设置allowCredentials为true
1 | "true") (allowCredentials = |
4)情况四:这里我再加一个吧,这个不是错误,如果你是情况一的错误,并且你有很多接口又不想去一个一个设置,这里有个慵懒的办法,那就是全局CORS配置,直接抄下面的代码,如果你已经有实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport的配置类则直接抄写类中的代码就好
1 |
|
多说一句:从spring boot2.0之后在构造spring配置文件时建议推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport ,经测试实现WebMvcConfigurer是没问题,但继承WebMvcConfigurationSupport类是会导致自动配置失效的。虽然我使用的是继承,但是我建议你使用实现的方式,避免不必要的麻烦
最后如果你真的使用继承的方式,以后导致SpringBoot的自动配置失效可以参考:https://blog.csdn.net/fmwind/article/details/82832758