摘要:@CrossOrigin注解没有生效在网上找了好多解决办法也都是很分散,今天将大多数的决绝办法总结一下。

一:跨域(CORS)支持

Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它。所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin

二:@CrossOrigin注解的使用位置

1)在controller类上使用,对所有controller中的所有方法都生效

1
2
3
4
5
@Controller
@CrossOrigin
public class MyController {

}

三:在Controller中的方法上使用,只对该方法生效

1
2
3
4
5
@CrossOrigin
@RequestMapping(value = "/test",method = RequestMethod.POST)
public void test(@RequestBody TestRequest testRequest){

}

四:使用@CrossOrigin注解后不能跨域访问的解决办法

1)情况一:在方法上使用@CrossOrigin注解,但@RequestMapping注解中没有指定Get、Post方式,通过method = RequestMethod.POST/GET指定或者指定@CrossOrigin注解中的methods = {RequestMethod.POST}后,问题解决。

1
2
3
4
5
#在@CrossOrigin中methods指定方式
@CrossOrigin(methods = {RequestMethod.POST})

#或者@RequestMapping注解定义method
@RequestMapping(value = "/test",method = {RequestMethod.POST})

原因:这里的注释已经解释了该方法会重写RequestMapping注解的方法,如果没有定义则使用RequestMapping注解的方法,所以在你不写@RequestMapping(method = {RequestMethod.POST})中的额method而@CrossOrigin中也没有定义所以无效喽

1
2
3
4
5
6
7
8
9
#观察@CrossOrigin中的解释
/**
* List of supported HTTP request methods, e.g.
* {@code "{RequestMethod.GET, RequestMethod.POST}"}.
* <p>Methods specified here override those specified via {@code RequestMapping}.
* <p>If undefined, methods defined by {@link RequestMapping} annotation
* are used.
*/
RequestMethod[] methods() default {};

2)情况二:跨域访问响应状态码是405-Method Not Allowed,请求行中指定的请求方法不能被用于请求相应的资源。原因很明显,就是请求不正确,检查代码,使用正确的方式请求。这个就不上图了,这属于粗心大意

3)情况三:查看springboot版本,如果是2.0以后版本,allowCredentials属性的默认值为false,返回的响应头AccessControlAllowCredentials属性值也为false,如果客户端携带cookie的请求这时是不能跨域访问的,所以需要手动在注解中设置allowCredentials为true

1
@CrossOrigin(allowCredentials = "true")

4)情况四:这里我再加一个吧,这个不是错误,如果你是情况一的错误,并且你有很多接口又不想去一个一个设置,这里有个慵懒的办法,那就是全局CORS配置,直接抄下面的代码,如果你已经有实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport的配置类则直接抄写类中的代码就好

1
2
3
4
5
6
7
8
9
10
11
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurationSupport {
/**
* 全局CORS配置
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}

多说一句:从spring boot2.0之后在构造spring配置文件时建议推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport ,经测试实现WebMvcConfigurer是没问题,但继承WebMvcConfigurationSupport类是会导致自动配置失效的。虽然我使用的是继承,但是我建议你使用实现的方式,避免不必要的麻烦

最后如果你真的使用继承的方式,以后导致SpringBoot的自动配置失效可以参考:https://blog.csdn.net/fmwind/article/details/82832758