← Назад к вопросам

Является ли CORS отдельным Spring Boot стартером?

2.0 Middle🔥 191 комментариев
#SOLID и паттерны проектирования#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Является ли CORS отдельным Spring Boot стартером?

Это частый вопрос на интервью, потому что показывает понимание архитектуры Spring и того, как работает CORS. Ответ: НЕТ, CORS не является отдельным Spring Boot стартером, это встроенная функциональность в Spring Framework (основа Spring Boot).

Структура Spring Boot стартеров

Что такое Spring Boot starter?

Spring Boot starter — это Maven/Gradle зависимость, которая упрощает добавление функциональности:

<!-- Примеры реальных стартеров -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Что НЕ стартер:

<!-- CORS не требует отдельного стартера -->
<!-- Он встроен в spring-boot-starter-web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- Этот стартер уже содержит CORS поддержку -->
</dependency>

Где находится CORS функциональность?

CORS встроен в spring-webmvc

spring-boot-starter-web
├── spring-boot (auto-configuration)
├── spring-webmvc (содержит CORS)
│   └── org.springframework.web.servlet.config.annotation.CorsRegistry
├── spring-core
└── другие зависимости

Классы CORS в Spring Framework:

// Главные классы CORS функциональности
org.springframework.web.cors.CorsConfiguration
org.springframework.web.cors.CorsConfigurationSource
org.springframework.web.cors.UrlBasedCorsConfigurationSource
org.springframework.web.servlet.config.annotation.CorsRegistry
org.springframework.web.filter.CorsFilter
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

Эти классы входят в spring-webmvc, который автоматически добавляется через spring-boot-starter-web.

Как работает CORS в Spring Boot

Способ 1: Глобальная конфигурация CORS

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
            .allowedOrigins("http://localhost:3000", "https://example.com")
            .allowedMethods("GET", "POST", "PUT", "DELETE")
            .allowedHeaders("*")
            .allowCredentials(true)
            .maxAge(3600);
    }
}

Способ 2: Аннотация @CrossOrigin на контроллере

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@CrossOrigin(origins = "http://localhost:3000")
public class UserController {
    @GetMapping("/users")
    public List<User> getUsers() {
        return userService.findAll();
    }
    
    @PostMapping("/users")
    @CrossOrigin(origins = "http://admin.example.com") // Переопределение для метода
    public User createUser(@RequestBody User user) {
        return userService.save(user);
    }
}

Способ 3: CORS Filter вручную

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 CorsFilterConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("http://localhost:3000");
        config.addAllowedOrigin("https://example.com");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        config.setMaxAge(3600L);
        
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        
        return new CorsFilter(source);
    }
}

Почему CORS не отдельный стартер?

Причины:

  1. CORS является базовой функциональностью веб-приложений — практически каждое веб-приложение его использует

  2. Тесная интеграция с веб-фреймворком — CORS должна работать на уровне HTTP фильтров и хендлеров, что требует глубокой интеграции со Spring Web

  3. Минимальный overhead — добавление CORS в основной стартер не добавляет значительный overhead

  4. Историческое решение — CORS была добавлена в Spring Web рано и стала стандартной функциональностью

Сравнение с другими функциями:

┌─────────────────────────────────────────────────────┐
│ spring-boot-starter-web (основной стартер)        │
│                                                     │
│ Встроено (не отдельный стартер):                  │
│ ✓ CORS (Spring Web)                                │
│ ✓ Jackson JSON (Spring Web)                        │
│ ✓ Validation (Spring Web)                          │
│ ✓ HTTP Handlers (Spring Web)                       │
│                                                     │
└─────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────┐
│ spring-boot-starter-security (отдельный стартер)  │
│                                                     │
│ Отдельный стартер потому что:                      │
│ ✓ Требует отдельной конфигурации                   │
│ ✓ Большой размер дополнительной библиотеки         │
│ ✓ Не всем приложениям нужна security               │
│ ✓ Может замедлить запуск приложения                │
│                                                     │
└─────────────────────────────────────────────────────┘

Полный пример Spring Boot приложения с CORS

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.Arrays;
import java.util.List;

@SpringBootApplication
public class CorsApplication {
    public static void main(String[] args) {
        SpringApplication.run(CorsApplication.class, args);
    }
    
    @Configuration
    public static class CorsConfig implements WebMvcConfigurer {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/api/**")
                .allowedOrigins("http://localhost:3000", "https://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("Content-Type", "Authorization")
                .allowCredentials(true)
                .maxAge(3600);
        }
    }
}

@RestController
@RequestMapping("/api")
public class ApiController {
    @GetMapping("/data")
    public List<String> getData() {
        return Arrays.asList("item1", "item2", "item3");
    }
    
    @PostMapping("/data")
    public String createData(@RequestBody String data) {
        return "Created: " + data;
    }
}

pom.xml (зависимости):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- CORS поддержка уже включена! -->
</dependency>

CORS на боевых серверах

Для production окружения рекомендуется:

  1. Конфигурировать через environment переменные:
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Value("${cors.allowed-origins}")
    private String allowedOrigins;
    
    @Value("${cors.max-age}")
    private long maxAge;
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
            .allowedOrigins(allowedOrigins.split(","))
            .maxAge(maxAge);
    }
}

application.yml:

cors:
  allowed-origins: "https://example.com,https://app.example.com"
  max-age: 3600
  1. Использовать CORS в API Gateway вместо приложения:
Client → API Gateway (CORS обработка) → Spring Boot приложение

Это более эффективно для микросервисов.

Вопросы на интервью по этой теме

Следующие вопросы часто возникают:

  1. Q: Какие HTTP-методы используются для CORS? A: OPTIONS (preflight), GET, POST, PUT, DELETE, PATCH

  2. Q: Что такое preflight запрос? A: Автоматический OPTIONS запрос, который браузер отправляет перед сложными запросами

  3. Q: Как отключить CORS для определённых endpoint'ов? A: Не добавлять их в CorsRegistry или использовать отдельные @CrossOrigin с пустыми origins

  4. Q: Может ли CORS работать с credentials? A: Да, через allowCredentials(true), но origins должны быть явно указаны

Заключение

CORS не является отдельным Spring Boot стартером потому что:

  1. Это встроенная функциональность Spring Framework (не Spring Boot специфика)
  2. Входит в spring-boot-starter-web как часть spring-webmvc
  3. Используется в большинстве веб-приложений
  4. Имеет минимальный overhead для базовой функциональности

Для использования CORS достаточно:

  • Добавить spring-boot-starter-web (обычно уже есть)
  • Конфигурировать через WebMvcConfigurer или @CrossOrigin
  • Больше никаких стартеров не требуется
Является ли CORS отдельным Spring Boot стартером? | PrepBro