什么是跨域
在了解跨域之前,我们先来了解以下同域。同域:协议、域名、端口都相同;否则就是跨域。例如在域名 aa.com
下发起一个资源访问 aa.com/books/info
的Ajax 请求,这个请求是被允许的。因为它是同域访问。如果在域名 aa.com
下发起一个资源访问 bb.com/books/info
的Ajax请求,这个请求就是跨域访问。一般情况下,跨域访问都会报错。
Spring 解决办法
@CrossOrigin
第一种办法就是使用 @CrossOrigin
注解,可以在@RestController
的class级别或方法级别定义一个@CrossOrigin
,例如:
// 表示允许主机localhost:8899访问这个服务,假设这个服务在localhost:8080
@CrossOrigin(origins = "http://localhost:8099")
@RestController
@RequestMapping("/api")
public class ApiController {
...
}
CorsRegistry
第二种方法是在 WebMvcConfigurer
中定义一个全局CORS配置。
@Bean
WebMvcConfigurer createWebMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://local.liaoxuefeng.com:8080")
.allowedMethods("GET", "POST")
.maxAge(3600);
// 可以继续添加其他URL规则:
// registry.addMapping("/rest/v2/**")...
}
};
}
Spring Security 解决办法
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic()
.and()
.cors().configurationSource(corsConfigurationSource())
.and()
.csrf().disable();
http.addFilterBefore(new MyFilter(), UsernamePasswordAuthenticationFilter.class);
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("http://localhost:8011"));
configuration.setAllowedMethods(Arrays.asList("GET","POST"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}