現在項目開發中,前後端分離越來越流行了,但在前後端分離通過 Ajax通路時會存在一個跨域的問題。即由于浏覽器的安全性限制,不允許 AJAX 通路協定不同、域名不同、端口号不同的資料接口,否則會出報 No 'Access-Control-Allow-Origin' header is present on the requested resource. 錯誤。如下所示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2YzM3EDN1QTM2IjMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
強大的 Spring Boot 支援通過設定 CORS(跨源資源共享)來解決跨域請求問題。具體如下幾種方式可以進行配置,我們選擇一種即可。
1、通過注解的方式
(1)、 在請求方法上添加注解 @CrossOrigin 說明此方法支援跨域
@Controller
public class UserController {
@GetMapping("/user")
@ResponseBody
@CrossOrigin
public User user(){
User user = new User();
user.setPassword("123456");
user.setUsername("admin");
user.setRegister(LocalDateTime.now());
return user;
}
}
(2)、在控制類上添加注解 @CrossOrigin ,相當于所有的方法都支援跨域,
@Controller
@CrossOrigin
public class UserController {
@GetMapping("/user")
@ResponseBody
public User user(){
User user = new User();
user.setPassword("123456");
user.setUsername("admin");
user.setRegister(LocalDateTime.now());
return user;
}
}
(3)、@CrossOrigin 注解參數配置:
- value:表示支援的域。這裡表示來自 http://localhost:8081 域的請求是支援跨域的。預設為 *,表示所有域都可以。
- maxAge:表示探測請求的有效期(先進性判斷是否有效)。探測請求不用每次都發送,可以配置一個有效期,有效期過了之後才會發送探測請求。預設為 1800 秒,即 30 分鐘。
- allowedHeaders:表示允許的請求頭。預設為 *,表示該域中的所有的請求都被允許。
2、全局配置
(1)添加自定義類實作 WebMvcConfigurer 接口,然後實作接口中的 addCorsMappings 方法。如下所示:
@Configuration
public class CrosConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
.maxAge(1800)
.allowedOrigins("*");
}
}
說明:
- addMapping:表示對哪種格式的請求路徑進行跨域處理。
- allowedHeaders:表示允許的請求頭,預設允許所有的請求頭資訊。
- allowedMethods:表示允許的請求方法,預設是 GET、POST 和 HEAD。這裡配置為 * 表示支援所有的請求方法。
- maxAge:表示探測請求的有效期
- allowedOrigins 表示支援的域
(2)、通過添加全局過CorsFilter 濾器的方式,如下所示:
@Configuration
public class CrosConfig {
@Bean
@Order(Integer.MAX_VALUE - 1)
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 允許任何域名使用
corsConfiguration.addAllowedHeader("*"); // 允許任何頭
corsConfiguration.addAllowedMethod("*"); // 允許任何方法(post、get等)
corsConfiguration.setAllowCredentials(true); //允許跨域傳輸所有的header參數
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(configSource);
}
}