Как настроить CORS в Spring Framework


При разработке веб-приложений время от времени возникает необходимость обращаться к ресурсам, размещенным на других доменах и портах. Это может быть статический контент, данные или API. Однако, из соображений безопасности браузеры применяют политику same-origin, которая по умолчанию запрещает такие запросы. В этой статье мы рассмотрим, как настроить Cross-Origin Resource Sharing (CORS) в Spring Framework, чтобы разрешить делать запросы между разными источниками данных.

Cross-Origin Resource Sharing (CORS) — это механизм, который позволяет серверу указывать браузеру, разрешено ли ему делать запросы с других источников данных. Чтобы это сработало, браузер отправляет заголовок Origin с запросом и сервер, в свою очередь, должен ответить с заголовком Access-Control-Allow-Origin, указывающим, разрешено ли браузеру получать доступ к серверу.

Spring Framework предоставляет удобные инструменты для настройки CORS. Можно использовать аннотацию @CrossOrigin для простой настройки CORS на уровне отдельных контроллеров или методов контроллеров. Если вам нужно установить глобальные настройки, вы можете использовать интерфейс WebMvcConfigurer. В дальнейшем мы рассмотрим оба этих подхода более подробно.

Что такое Cross-Origin Resource Sharing (CORS)

При разработке веб-приложений часто возникает необходимость обращения к ресурсам, расположенным на другом домене. Однако, из соображений безопасности, веб-браузеры ограничивают доступ к таким ресурсам. Это может привести к проблемам, когда клиентское приложение, запущенное в одном домене, пытается получить данные с сервера, находящегося в другом домене. Для решения этой проблемы был разработан механизм Cross-Origin Resource Sharing (CORS).

CORS – это механизм, который позволяет серверу согласиться на обработку запросов с других доменов веб-приложений. Без использования CORS, веб-браузеры ограничивают такие запросы из соображений безопасности (браузеры не разрешают JavaScript-коду получать доступ к данным и ресурсам, расположенным на другом домене).

Механизм CORS реализуется с помощью передачи специальных HTTP-заголовков, которые обеспечивают взаимодействие между веб-приложениями, работающими на разных доменах. Основная задача CORS – дать серверам возможность сообщать браузеру, какие домены имеют право обращаться к ресурсу. Таким образом, сервер определяет, какие запросы будут являться разрешенными, а какие – запрещенными.

Реализация CORS в Spring Framework позволяет контролировать доступ к ресурсам приложения и настроить правила доступа для разных доменов. Она предоставляет возможность гибкой настройки и контроля запросов, что позволяет разработчикам более точно определить, какие домены могут получать доступ к ресурсам, расположенным на их сервере.

Настройка CORS в Spring Framework

Следуя этим простым шагам, вы сможете настроить CORS в Spring Framework:

  1. Добавьте зависимость в файле pom.xml:
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
  2. Создайте класс конфигурации для настройки CORS:
    package com.example.config;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.CorsRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "DELETE").allowedHeaders("*").allowCredentials(true);}}
  3. Добавьте аннотацию @EnableWebMvc к классу вашего приложения:
    package com.example;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.servlet.config.annotation.EnableWebMvc;@SpringBootApplication@EnableWebMvcpublic class YourApplication {public static void main(String[] args) {SpringApplication.run(YourApplication.class, args);}}
  4. Теперь ваше приложение настроено для CORS. Оно будет принимать запросы с любого источника и разрешать методы GET, POST, PUT и DELETE, а также передавать разрешенные заголовки и учетные данные клиента.

Теперь у вас есть полная настройка CORS в вашем Spring Framework-приложении. Вы можете легко управлять доступом к ресурсам с других источников и создавать более гибкие веб-приложения.

Шаг 1: Добавление зависимостей

Прежде чем начать настройку Cross-Origin Resource Sharing (CORS) в Spring Framework, необходимо добавить соответствующие зависимости в проект.

Один из способов добавить эти зависимости — использовать инструмент управления зависимостями Maven. Добавьте следующие зависимости в свой файл pom.xml:

<dependencies><!-- Другие зависимости --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- Другие зависимости --></dependencies>

Здесь мы добавляем зависимости для Spring Web, Spring Security и Spring Data JPA, которые понадобятся нам в процессе настройки CORS.

После добавления этих зависимостей, убедитесь, что Maven автоматически скачал и установил их в вашем проекте.

Шаг 2: Создание класса конфигурации

Для настройки Cross-Origin Resource Sharing (CORS) в Spring Framework необходимо создать класс конфигурации, в котором будет определена конфигурация для обработки CORS.

Создадим новый класс с именем CorsConfig. Для этого создаем новый файл с расширением .java и помещаем его в пакет с другими классами конфигурации.

Внутри класса CorsConfig добавляем аннотацию @Configuration, которая указывает, что данный класс является классом конфигурации.

Ниже добавляем метод с аннотацией @Bean, который будет возвращать CorsConfigurationSource — объект с конфигурацией CORS.

Внутри метода создаем новый объект CorsConfiguration и настраиваем его параметры.

Для начала, устанавливаем разрешенные источники с помощью метода setAllowedOrigins. В качестве параметра передаем список разрешенных источников. Например, можно указать «http://localhost:3000», чтобы разрешить доступ с данного источника.

Затем, устанавливаем разрешенные методы запроса с помощью метода setAllowedMethods. В качестве параметра передаем список разрешенных методов запроса. Например, можно указать «GET», «POST», чтобы разрешить только эти методы.

Далее, устанавливаем разрешенные заголовки запроса с помощью метода setAllowedHeaders. В качестве параметра передаем список разрешенных заголовков запроса. Например, можно указать «Authorization», чтобы разрешить передачу заголовка авторизации.

Наконец, устанавливаем разрешенные куки с помощью метода setAllowCredentials. Устанавливаем значение true, чтобы разрешить передачу куки.

После настройки объекта CorsConfiguration возвращаем его с помощью ключевого слова return.

Теперь у нас есть класс конфигурации для обработки CORS. В следующем шаге мы подключим его к основному классу приложения.

Шаг 3: Настройка CORS для контроллеров

Когда мы уже настроили глобальные CORS-фильтры для приложения, теперь мы можем указать настройки CORS для каждого конкретного контроллера.

Для этого нам понадобится аннотация @CrossOrigin. Чтобы указать, какие источники могут обращаться к нашему контроллеру, мы можем использовать следующие атрибуты:

  • value: список источников, разделенных запятыми. Например, «https://example.com, http://localhost:8080».
  • origins: альтернативный атрибут для указания источников. Также может принимать список источников, разделенных запятыми.
  • allowedHeaders: список разрешенных заголовков, разделенных запятыми.
  • methods: список разрешенных HTTP-методов, разделенных запятыми. Например, «GET, POST».
  • allowCredentials: указывает, разрешено ли отправлять учетные данные (например, куки или заголовок HTTP «Authorization») на кросс-доменный запрос.
  • maxAge: максимальное время в секундах для кэширования префлайт-запросов.

Применим аннотацию @CrossOrigin к нашему контроллеру, чтобы разрешить запросы с определенных источников и разрешенные заголовки:

@CrossOrigin(origins = "https://example.com", allowedHeaders = "Content-Type")@RestController@RequestMapping("/api")public class ExampleController {// код контроллера}

В данном примере мы разрешили доступ к контроллеру только с источника «https://example.com» и разрешили только заголовок «Content-Type». Вы можете настроить такие атрибуты, как «methods», «allowCredentials» и «maxAge» в соответствии с вашими потребностями.

Это позволяет нам точно контролировать, какие запросы будут разрешены нашему контроллеру, и обеспечивает безопасность и защиту от злоумышленников.

Примечание: Если вы уже настроили глобальные CORS-фильтры для приложения, и вам необходимо изменить настройки для конкретного контроллера, убедитесь, что эти настройки не будут конфликтовать.

Примеры настройки CORS

Ниже представлены примеры настройки CORS в Spring Framework:

1. Аннотация @CrossOrigin

Простейший способ настроить CORS в Spring — использовать аннотацию @CrossOrigin над методом контроллера. Например:

@CrossOrigin(origins = "http://example.com")

Этот код позволяет запросам, исходящим с http://example.com, получать доступ к данным, возвращаемым данным методом контроллера.

2. Настройка в файле конфигурации

Более гибкий подход — настройка CORS в файле конфигурации приложения. Для этого нам понадобится класс, помеченный аннотацией @Configuration. Например:

@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*");
}
};
}
}

Этот код позволяет запросам, отправленным на любой URL, начинающийся именно с /api/, получать доступ к данным и использовать разрешенные методы запроса (GET, POST, PUT, DELETE), а также заголовки.

3. Применение фильтра

Третий вариант — использование фильтра. Этот метод предлагает большую гибкость при настройке CORS. Для этого вам понадобится создать класс, реализующий интерфейс javax.servlet.Filter. Например:

public class CustomCorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Access-Control-Allow-Origin", "http://example.com");
httpResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE");
httpResponse.setHeader("Access-Control-Allow-Headers", "*");
chain.doFilter(request, response);
}
// ...
}

После создания фильтра необходимо зарегистрировать его, добавив следующий код в класс WebApplicationInitializer:

FilterRegistration.Dynamic corsFilter = servletContext.addFilter("customCorsFilter", CustomCorsFilter.class);
corsFilter.addMappingForUrlPatterns(null, false, "/api/*");

Это позволяет запросам, отправленным на любой URL, начинающийся с /api/, получать доступ к данным и использовать разрешенные методы запроса (GET, POST, PUT, DELETE), а также заголовки.

Пример 1: Разрешение доступа от любого источника

В этом примере мы настроим Spring Framework так, чтобы он разрешал доступ от любого источника. Для этого мы будем использовать аннотации @CrossOrigin и @RequestMapping.

Вначале, добавим аннотацию @CrossOrigin к нашему контроллеру. Эта аннотация позволяет настроить разрешение CORS для всех методов контроллера.

«`java

@CrossOrigin(origins = «*»)

@RestController

@RequestMapping(«/api»)

public class ApiController {

// …

}

Затем, мы можем использовать аннотацию @CrossOrigin для конкретного метода, если нам нужно настроить CORS только для этого метода.

«`java

@CrossOrigin(origins = «*»)

@GetMapping(«/users»)

public List getUsers() {

return userRepository.findAll();

}

Теперь Spring Framework будет разрешать доступ от любого источника. Если вы хотите ограничить доступ только от некоторых источников, вместо символа звездочки (*) в аннотации @CrossOrigin укажите список разрешённых источников.

Таким образом, мы настроили CORS в нашем приложении Spring Framework для разрешения доступа от любого источника.

Пример 2: Ограничение доступа к определенным источникам

В Spring Framework можно настроить такую ограничение с помощью аннотации @CrossOrigin и атрибута origins.

Например, для разрешения доступа только с источника http://example.com, необходимо добавить аннотацию @CrossOrigin(origins = «http://example.com») к контроллеру или методу контроллера:

@CrossOrigin(origins = "http://example.com")@RestControllerpublic class MyController {// ...}

Теперь доступ к этому контроллеру или методу контроллера разрешен только с источника http://example.com. Запросы с других источников будут блокироваться.

Такой подход позволяет более тонко настроить доступ к API и предотвратить несанкционированные запросы со сторонних источников. Необходимо только убедиться, что указанный источник действительно доверенный.

Добавить комментарий

Вам также может понравиться