Кросс-домен Spring API - PullRequest
       4

Кросс-домен Spring API

0 голосов
/ 24 марта 2020

Я получил сервер Tomcat, используя Spring и веб-сайт React. Я пытаюсь получить данные, с почтальоном все в порядке, но когда я использую свой интерфейс реакции, я получаю следующую ошибку:

Доступ к выборке в 'http://127.0.0.1: 8080 / planningAccouplementWS / acquerirFemelles 'from origin' http://localhost: 3000 'заблокировано политикой CORS: Ответ на предпечатный запрос не проходит проверку контроля доступа: не имеет статуса HTTP ok.

На внешней стороне я вызываю этот код:

static acquerirFemelles(femelles) {
    var myHeaders = new Headers();
    myHeaders.append("Accept", "application/json");
    myHeaders.append("Content-Type", "application/json");
    myHeaders.append("apikey", "sfj4-R5sdhffhs-fnhvSDFYT:DSRrfdj#fhqsm4zxwc-vhglxs15");

    let obj = [];
    femelles.forEach(femelle => {
        obj.push({
            "codePays": femelle.cheptel_pays,
            "numeroNational": femelle.numero_national.substring(2),
            "nom": femelle.bovin_nom
        })
    });
    var raw = JSON.stringify({
        "listeFemelles": obj
    });

    console.log(raw);

    var requestOptions = {
        method: 'POST',
        headers: myHeaders,
        body: raw
    };

    fetch("http://127.0.0.1:8080/planningAccouplementWS/acquerirFemelles", requestOptions)
        .then(response => response.text())
        .then(result => console.log(result))
        .catch(error => console.log('error', error));
}

А на моей стороне сервера: WebConfig. java

public class WebConfig implements WebMvcConfigurer{

    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/**")
            .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH")
            .allowedOrigins("http://locahlost:3000")
            .allowedHeaders("*")
            .allowCredentials(true)
            .maxAge(3600);
    }

}

SecurityConfiguration. java

@Configuration
@EnableWebSecurity
@Order(1)
@PropertySource(value = "classpath:/security.properties")
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Value("${yourapp.http.auth-token-header-name}")
    private String principalRequestHeader;

    @Value("${yourapp.http.auth-token}")
    private String principalRequestValue;

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        System.out.println("Cors configure");
        APIKeyAuthFilter filter = new APIKeyAuthFilter(principalRequestHeader);
        filter.setAuthenticationManager(new AuthenticationManager() {

            @Override
            public Authentication authenticate(Authentication authentication) throws AuthenticationException {
                String principal = (String) authentication.getPrincipal();
                if (!principalRequestValue.equals(principal))
                {
                    throw new BadCredentialsException("The API key was not found or not the expected value.");
                }
                authentication.setAuthenticated(true);
                return authentication;
            }
        });
        httpSecurity.
        antMatcher("/**").
        csrf().disable().cors().and().
        sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and().addFilter(filter).authorizeRequests().anyRequest().authenticated()
        .and().exceptionHandling().accessDeniedHandler(new AccessDeniedHandlerImpl());
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() 
    {
        System.out.println("Cors corsConfigurationSource");
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowCredentials(true);
        configuration.addAllowedOrigin("http://localhost:3000");
        configuration.addAllowedHeader("*");
        configuration.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        CorsFilter filter = new CorsFilter(source);
        return source;
    }

}

И наконец мой метод GET

@CrossOrigin(origins = "*", allowedHeaders = "*")
    @PostMapping("/acquerirFemelles")
    public DonneesElevages acquerirFemelle(@RequestBody DonneesElevages donneesElevage) throws MetierException {
        System.out.println("Acquerir Femelles");
        DonneesElevages de = new DonneesElevages();
        FemelleMetier femelleMetier = new FemelleMetier();
        CoefficientMetier coefMetier = new CoefficientMetier();

        HashMap<String, ParametreIndex> listeParametreIndex = coefMetier.rechercherParametresIndex();

        de.setListeFemelles(femelleMetier.rechercheFemelles(donneesElevage.getListeFemelles(), listeParametreIndex));

        return de;
    }

1 Ответ

0 голосов
/ 24 марта 2020

У вас есть аннотация @CrossOrigin в вашем методе отображения, поместите эту аннотацию в класс контроллера.

Если вы хотите сделать это простым способом, вы можете просто использовать аннотацию @CrossOrigin на вашем контроллере классы. Но в любом случае, будьте осторожны, так как это пропустит все запросы независимо от того, с какого URL или порта они пришли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...