Giới Thiệu
Chào các bạn, trong bài viết này, mình sẽ tiếp tục phần 1 trước đó về CORS (Cross-Origin Resource Sharing) và hướng dẫn cách cấu hình CORS trong ứng dụng Spring Boot. Đây là chủ đề rất quan trọng đối với việc phát triển web, đặc biệt là khi ứng dụng của bạn cần giao tiếp với nhiều nguồn khác nhau từ các miền khác nhau.
Những Cách Cấu Hình CORS Trong Spring Boot
Trong Spring Boot, có ba cấp độ chính mà bạn có thể cấu hình CORS:
- Mức độ Controller
- Global (WebMvcConfigurer)
- Trong Spring Security
Lưu ý: Trong bài viết này, mình sẽ không đề cập đến cấu hình CORS với Spring Webflux.
1. Cấu Hình CORS Trong Controller
Cách đơn giản nhất để cấu hình CORS là sử dụng annotation @CrossOrigin
ngay trên controller hoặc trên từng endpoint.
Ưu Điểm
- Phù hợp khi bạn muốn cấu hình CORS cho một số endpoint cụ thể.
- Dễ hiểu và dễ quản lý nếu bạn có ít endpoint.
Ví dụ:
java
@RestController
@RequestMapping("/api/users")
public class UserController {
// Bật CORS cho endpoint này
@CrossOrigin(origins = "http://example.com")
@GetMapping("/{id}")
public String getUser(@PathVariable String id) {
return "User ID: " + id;
}
// Không có @CrossOrigin => Không bật CORS
@PostMapping
public String createUser(@RequestBody String user) {
return "User created: " + user;
}
}
- Trong ví dụ trên, browser chỉ cho phép request từ
http://example.com
khi gọi API/api/users/{id}
.
Nhược Điểm
1. Quản lý khó khăn trong ứng dụng lớn:
- Nếu nhiều controller hoặc endpoint, việc sử dụng
@CrossOrigin
sẽ gây lặp lại, khó bảo trì. - Khi cần thay đổi chính sách CORS, bạn phải điều chỉnh ở nhiều nơi.
2. Không phù hợp với cấu hình phức tạp:
@CrossOrigin
không cho phép tùy chỉnh tất cả các tùy chọn phức tạp như headers, thời gian caching cho preflight.
3. Vấn đề với Spring Security:
- Nếu bạn sử dụng Spring Security, các request HTTP sẽ bị xử lý qua filter chain trước khi đến controller, dẫn đến việc cấu hình CORS có thể bị bỏ qua nếu không được cấu hình đúng trong security.
2. Cấu Hình CORS Ở Mức Global (WebMvcConfigurer)
Cách thứ hai, bạn có thể cấu hình CORS ở mức toàn cầu để áp dụng cho tất cả các endpoint bằng cách sử dụng WebMvcConfigurer
.
Ví dụ cấu hình:
java
@Configuration
public class GlobalCorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("Authorization", "Content-Type")
.allowCredentials(true);
}
}
- Việc cấu hình CORS ở mức toàn cầu rất đơn giản và đảm bảo tăng tính dễ quản lý của ứng dụng.
3. Cấu Hình Trong Spring Security
Cuối cùng, bạn có thể cấu hình CORS ngay trong Spring Security. Việc này sẽ cho phép cấu hình CORS áp dụng cho các yêu cầu được bảo vệ bởi Spring Security.
Ví dụ cấu hình:
java
@Configuration
public class SecurityConfig {
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(List.of("https://example.com", "https://viblo.asia"));
configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
configuration.setAllowedHeaders(List.of("Authorization", "Content-Type"));
configuration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/api/**", configuration);
return source;
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.cors().and()
.authorizeHttpRequests(auth -> auth.anyRequest().permitAll())
.httpBasic(Customizer.withDefaults())
.csrf(csrf -> csrf.disable());
return http.build();
}
}
Kết Luận
Như vậy, việc cấu hình CORS trong Spring Boot không hề phức tạp, nhưng bạn cần chú ý sẽ áp dụng ở đâu cho hợp lý tùy theo mô hình ứng dụng bạn đang phát triển. Hi vọng những chia sẻ này sẽ giúp ích cho bạn trong quá trình làm việc với Spring Boot. Nếu bạn có bất kỳ câu hỏi hay ý kiến phản hồi nào, hãy để lại comment ở phía dưới!
Cảm ơn bạn đã đọc bài viết này!
Sài Gòn, 15:06 22/12/2024
source: viblo