Ошибка политики CORS с Java + Spring в запросе ajax - PullRequest
0 голосов
/ 19 февраля 2020

работа с Java 11, eclipse, Gradle и spring в Ubuntu OS

Пока мои POST-вызовы работают нормально, GET-вызовы на сервер блокируются из-за политики CORS с ошибкой ниже:

Доступ к XMLHttpRequest по адресу 'http://localhost: 8080 / dices / Players ? {}' From origin 'http://localhost' заблокирован Политика CORS: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».

javascript для POST и GET вызывает:

$(document).ready(function(){
    $('#newUserButton').click(function(){
        $.ajax({
            type: 'POST',
            url: 'http://localhost:8080/dices/players',
            contentType: 'application/json',
            xhrFields: { withCredentials: true },
            data: JSON.stringify({"name":$('#newUserInput').val()}),
            dataType: 'json',
            success: function(data) {
                $('#newUserJumbo').append('<div class="alert alert-success" role="alert">El usuari ' + data.name + ' ha estat creat</div>');
                },
            error: function(e){
                console.log(e);
            }
        });
    });
});

$(document).ready(function(){
    $('#searchUserButton').click(function(){
        $.ajax({
            type: 'GET',
            url: 'http://localhost:8080/dices/players',
            contentType: 'application/json',
            xhrFields: { withCredentials: true },
            data: JSON.stringify({"idPlayer":$('searchUserInput').val()}),
            dataType: 'json',
            success: function(data) {
                $('#modifyUserUl').append('<button type="button" class="list-group-item list-group-item-action" id="' + data.id + ' onclick=modifyUser(' + data.id + '>id: ' + data.id + ', nom: ' + data.name + '</button>');
            },
            error: function(e){
                console.log(e);
            }
        });
    });
});

Для обработки CORS на стороне сервера, я использую следующий класс, который я нашел в mozilla mdnwebDo c здесь , который работает нормально с вызовом POST, но не работает на GET

код, который обрабатывает вызов GET, выглядит следующим образом:

    @CrossOrigin(origins = "http://lvh.me:8080")
    @GetMapping("/players/player")
    public Player getPlayer(@RequestBody Player newPlayer){
        try {
            return (Player) repository.findFirstByNameLike(newPlayer.getName());
        } catch (EmptyResultDataAccessException e) {
            throw new PlayerNotFoundException(newPlayer.getName());

UPDATE 1

Как прокомментировал Альберт, я изменили http://localhost на http://lvh.me, чтобы увидеть, работает ли этот код, но нет выхода. Также я отредактировал изменение кода моего контроллера с @PathVariable на @RequestBody (так как мой POST-запрос на тот же контроллер с телом json работает) также с эффектом. Наконец, благодаря комментариям Кевина, я также изменил способ обработки политики CORS с глобального подхода на подход с контроллером, также без выхода. Я изменил код выше, чтобы отразить c эти изменения.

Любые комментарии и предложения приветствуются. Спасибо, спасибо

1 Ответ

0 голосов
/ 19 февраля 2020

Вы можете специально включить CORS для этой конечной точки, используя следующее:

@CrossOrigin(origins = "http://localhost:8080")
@GetMapping("/players/{idPlayer}")
public Player getPlayer(@PathVariable Integer idPlayer){
    try {
        return (Player) repository.findById(idPlayer);
    } catch (EmptyResultDataAccessException e) {
        throw new PlayerNotFoundException(idPlayer);
    }
}

Если вы хотите обратиться к CORS на глобальном уровне, вам нужно создать bean-компонент WebMvcConfigurer в классе с помощью метода main. :

@SpringBootApplication
public class YourApplication {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("http://localhost:8080");
            }
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...