Введение

Веб-разработчикам не понаслышке знакомы проблемы, возникающие при совместном использовании ресурсов между источниками (CORS). Однако, если вы используете Spring Boot для разработки своих RESTful-сервисов, вам повезло. Аннотация @CrossOrigin обеспечивает эффективный и лаконичный способ решения проблем, связанных с CORS. В этом сообщении блога мы углубимся в понимание аннотации @CrossOrigin и то, как она упрощает управление между источниками.

Что такое КОРС?

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

Почему CORS необходим?

Представьте себе сценарий, когда вы входите на сайт, скажем, example.com. Этот сайт после успешной аутентификации сохраняет файл cookie в вашем браузере. Теперь предположим, что вы посетили вредоносный сайт. Без CORS этот вредоносный сайт мог бы отправить запрос example.com и получить доступ к вашим данным, используя сохраненный файл cookie. Именно это CORS намерен предотвратить.

Представляем аннотацию @CrossOrigin

В мире Spring Boot упрощение сложных задач до простых аннотаций является обычным явлением. Одной из таких мощных аннотаций, введенных для управления CORS в приложениях Spring, является @CrossOrigin.

При создании приложений в Spring обычно имеется серверная часть, предоставляющая API, и внешний интерфейс, который его использует. Если оба обслуживаются из одного и того же домена или порта, вы можете столкнуться с распространенной ошибкой браузера, связанной с политикой одного и того же происхождения. Эта политика запрещает веб-странице отправлять запросы к домену, отличному от того, который ее обслуживал, гарантируя, что потенциально вредоносные сайты не смогут получить доступ к конфиденциальным данным.

Аннотация @CrossOrigin является спасением в таких сценариях. По своей сути он обеспечивает способ обойти политику одного и того же происхождения, применяемую веб-браузерами. Эта аннотация указывает, что определенный метод контроллера или все методы в классе контроллера могут быть вызваны кодом JavaScript из другого источника.

Вот несколько основных выводов об этой аннотации:

  • Гибкость. Прелесть @CrossOrigin заключается в его гибкости. Вы можете применить его только к одному методу контроллера, ко всем методам в контроллере или глобально для всех контроллеров. Такая детализация гарантирует, что вы сможете точно настроить, какие части вашего приложения будут доступны из разных источников.
  • Настраиваемость. С помощью его атрибутов вы можете определить, какие методы HTTP разрешены, какие заголовки запросов можно отправлять и даже каким источникам разрешен доступ к ресурсу. Это не просто переключатель включения/выключения, а универсальный инструмент, позволяющий точно согласовать совместное использование ресурсов между источниками с требованиями вашего приложения.
  • Простота. Одной из выдающихся особенностей @CrossOrigin является его простота. Вместо того, чтобы возиться с длинными настройками конфигурации, простая аннотация может решить ваши проблемы с CORS. Это делает вашу кодовую базу чистой и понятной, что упрощает обслуживание.

По сути, аннотация @CrossOrigin является свидетельством философии Spring Boot по упрощению процесса разработки. Независимо от того, являетесь ли вы новичком, только начинающим работать со Spring Boot, или опытным разработчиком, понимание и использование @CrossOrigin, несомненно, будет полезно для создания отказоустойчивых и доступных веб-приложений.

Как использовать @CrossOrigin в Spring Boot?

Глобальная конфигурация

Если вы хотите включить запросы между источниками для всех ваших контроллеров и их конечных точек, вы можете настроить их глобально в своем приложении Spring Boot. Вот как вы можете это сделать:

@Configuration
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("*")
                        .allowedMethods("GET", "POST", "PUT", "DELETE");
            }
        };
    }
}

Эта конфигурация гарантирует, что ко всем конечным точкам вашего приложения можно получить доступ из любого источника с помощью HTTP-методов GET, POST, PUT или DELETE.

Конфигурация на уровне контроллера

Если вы хотите включить CORS для определенного контроллера, то @CrossOrigin можно добавить на уровне класса контроллера.

@RestController
@CrossOrigin(origins = "http://allowed.origin.com")
public class MyController {

    @GetMapping("/endpoint")
    public String getEndpoint() {
        return "Hello, World!";
    }
}

В приведенном выше примере только запросы от http://allowed.origin.com будут иметь доступ к конечным точкам в MyController.

Конфигурация уровня конечной точки

Вы также можете применить аннотацию @CrossOrigin к определенным методам (конечным точкам) внутри контроллера. Это обеспечивает детальный контроль над тем, какие конечные точки разрешают запросы между источниками.

@RestController
public class MyController {

    @CrossOrigin(origins = "http://specific.origin.com")
    @GetMapping("/specific-endpoint")
    public String getSpecificEndpoint() {
        return "Hello from the specific endpoint!";
    }
}

Здесь из http://specific.origin.com можно получить доступ только к /specific-endpoint.

Расширенные конфигурации @CrossOrigin

Аннотация @CrossOrigin предлагает дополнительные возможности настройки:

  • allowedOrigins. Чтобы указать, какие источники разрешены. Например, origins = "http://example.com".
  • allowedHeaders определяет, какие заголовки запроса могут использоваться при выполнении фактического запроса.
  • exposeHeaders: заголовки (кроме простых заголовков ответов), к которым браузерам разрешен доступ.
  • методы. Какие методы HTTP разрешены, например methods = {RequestMethod.GET, RequestMethod.POST}.
  • maxAge: максимальный возраст (в секундах), в течение которого ответ может быть кэширован.
  • allowCredentials: разрешены ли файлы cookie или HTTP-аутентификация.

Заключение

Аннотация @CrossOrigin в Spring Boot предоставляет разработчикам быстрый и простой способ управления запросами между источниками. Хотя политика CORS имеет решающее значение для безопасности, современные приложения часто требуют определенного уровня совместного использования между источниками. С помощью Spring Boot разработчики могут легко сбалансировать потребности безопасности и функциональности.

  1. Официальная документация Spring — CORS
  2. Baeldung — CORS со Spring

Понравилось чтение? Еще не являетесь участником Medium? Вы можете поддержать мою работу напрямую, зарегистрировавшись по моей реферальной ссылке здесь. Это быстро, легко и не требует дополнительных затрат. Спасибо за вашу поддержку!

Спасибо, что дочитали до конца. Пожалуйста, подумайте о том, чтобы подписаться на автора и эту публикацию. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.