在前端访问地址或者端口跟自身项目不一样的后端地址时,会出现跨域问题
请求会经过拦截器
然后在到达controller
在controller层,我们可以使用 @CrossOrigin 注解来解决这个问题,
这个注解可以解决大部分的跨域问题,
但是如果如果请求是post,而且请求头里header 中 "Content-Type": "application/json;charset=UTF-8"
(通常这种请求是让我们后端接收一个json对象的,后端通常也会用 @RequestBody 放在参数前,让框架帮我们实例化这个对象)
那么就这个请求就会变成options的方式,会被拦截器拦截掉,无法进入到controller,
这个时候就需要用CrossOriginConfig来解决
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CrossOriginConfig {
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 设置你要允许的网站域名,如果全允许则设为 *
config.addAllowedOrigin("*");
// 如果要限制 HEADER 或 METHOD 请自行更改
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
// 这个顺序很重要哦,为避免麻烦请设置在最前
bean.setOrder(0);
return bean;
}
}