Spring解决跨域请求问题
1、spring提供解决跨域问题的方式
- springMvc4.2以上提供了解决跨域请求的注解@CrossOrigin
2、@CrossOrigin的使用 - 该注解提供了2个参数分别是:origins: 允许可访问的域列表 maxAge:准备响应前的缓存持续的最大时间(以秒为单位)
- 该注解可以使用在整个Controller上,也可以单独使用到某接口上(也可以同时使用)
注意:当单独使用在某个接口上时,代表将该接口加入白名单,则这接口不会被拦截,若将注解加载整个Controller上则代表将该Controller下的接口都加入白名单,外部请求不会被拦截。
eg:
--全局的
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
--局部的
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
--同时使用
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin(origins = "http://domain2.com")
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
3、Spring Security配置cors
注意: 请确保在Spring安全级别启用CORS,并允许它利用Spring MVC级别定义的配置
//启用cors
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()...
}
}
全局配置cors
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(false).maxAge(3600);
}
};
}
}