При разработке веб-приложений время от времени возникает необходимость обращаться к ресурсам, размещенным на других доменах и портах. Это может быть статический контент, данные или 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)
- Настройка CORS в Spring Framework
- Шаг 1: Добавление зависимостей
- Шаг 2: Создание класса конфигурации
- Шаг 3: Настройка CORS для контроллеров
- Примеры настройки CORS
- Пример 1: Разрешение доступа от любого источника
- Пример 2: Ограничение доступа к определенным источникам
Что такое 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:
- Добавьте зависимость в файле pom.xml:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
- Создайте класс конфигурации для настройки 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);}}
- Добавьте аннотацию @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);}}
- Теперь ваше приложение настроено для 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 и предотвратить несанкционированные запросы со сторонних источников. Необходимо только убедиться, что указанный источник действительно доверенный.