Java — Spring Boot: Access-Control-Allow-Origin не работает

Я попытался реализовать Access-Control- Allow-Origin при весенней загрузке, используя несколько руководств и эту ссылку но не в состоянии реализовать это.

Чтобы реализовать это, в файле application.properties я добавил строку ниже

endpoints.cors.allowed-origins=https://example.com

Вероятно, это означает, что кроме URL-адреса https://example.com никакая другая конечная точка не может вызывать какие-либо API. Но это не работает, я все еще вижу * в ответ на изображении ниже. Какие имена из других доменов, мои API доступны. Итак, как предотвратить это?

введите здесь описание изображения


person Kishan Solanki    schedule 12.12.2019    source источник


Ответы (4)


endpoints.cors.allowed-origins для Spring boot 1 или management.endpoints.web.cors.allowed-origins для Spring boot 2 используются для применения CORS к конечным точкам привода, они не применяются к определенным вами конечным точкам контроллера.

На самом деле по умолчанию Spring boot не устанавливает заголовки CORS. Если вы видите Access-Control-Allow-Origin со значением (например, подстановочным знаком), это означает, что вы настраиваете это где-то в своем собственном коде. Убедитесь, что вы используете @CrossOrigin на своих контроллерах или что у вас есть какой-то Filter (например, CorsFilter).

Один из способов глобальной настройки CORS в рамках загрузки Spring — определение bean-компонента CorsFilter, например:

@Bean
public CorsFilter corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.setAllowedOrigins(List.of("https://example.com"));
    config.setAllowedHeaders(List.of("Origin", "Content-Type", "Accept"));
    config.setAllowedMethods(List.of("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH"));
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

Чтобы узнать о других возможностях, вы можете проверить этот вопрос. Имейте в виду, это будет работать правильно, только если вы узнаете, что вызывает установку Access-Control-Allow-Origin.

person g00glen00b    schedule 12.12.2019

попробуйте эту аннотацию @Crossorigin("*") в вашем контроллере. Вы можете изменить параметр в аннотации в соответствии с вашими потребностями

person Vikram Saini    schedule 12.12.2019
comment
У меня более 10 контроллеров. Вы действительно считаете хорошей практикой помещать его отдельно в каждый контроллер? Кроме того, я не хочу «*», я хочу добавить только выбранные домены для перекрестного происхождения. Чтобы никакие другие домены не могли получить доступ к моим API - person Kishan Solanki; 12.12.2019

Вы можете определить собственный фильтр cors для своего проекта, как это

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class CustomeCORSFilter implements Filter {

private final Logger log = LoggerFactory.getLogger(CustomeCORSFilter.class);

public CustomeCORSFilter() {
    log.info("CustomeCORSFilter init");
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;


    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS,PUT, DELETE");
  response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    response.setHeader("Access-Control-Max-Age", "");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With,");

    chain.doFilter(request, response);
}

@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void destroy() {
}

}
person GaneshSreeju    schedule 12.12.2019

Наконец, я решил эту проблему, добавив следующее в свой класс Application.

@Bean
public WebMvcConfigurer corsConfigurer() {

    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("https://example.com",
                            "https://www.example.com",
                            "http://192.168.1.12:3000",
                            "http://localhost:3000");
        }
    };
}

Таким образом, окончательный класс приложения будет выглядеть примерно так:

@SpringBootApplication
@EnableScheduling
@EnableAsync
public class ExampleApplication {

public static void main(String[] args) {
    SpringApplication.run(ExampleApplication.class, args);
}

@Bean
public WebMvcConfigurer corsConfigurer() {

    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("https://example.com",
                            "https://www.example.com",
                            "http://192.168.1.12:3000",
                            "http://localhost:3000");
        }
    };
   }
}
person Kishan Solanki    schedule 16.02.2021