Не удается исправить ошибку CORS (angular + java spring) - PullRequest
0 голосов
/ 07 апреля 2020

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

Access to XMLHttpRequest at 'http://localhost:8081/api/transactions/' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Я могу получить данные с помощью почтальона, но не мой веб-интерфейс. Я использую angular и пружинную загрузку.
Мое приложение. java:

@EnableJpaRepositories
@EntityScan
@SpringBootApplication
public class KoalaTreeAccountingApplication {

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

}

Мой конфиг безопасности:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest()
                .permitAll()
                .and().csrf().disable();
    }
}

Мой сервис для выполнения http-вызова в angular:

@Injectable({
    providedIn: 'root'
})
export class TransactionService {
    baseUrl = 'http://localhost:8081/api/';
    transactionUrl = this.baseUrl + 'transactions/';

    constructor(private http: HttpClient, private logger : Logger){ }

    getAllTransactions() : Observable<Transaction[]> {
        this.logger.log("Request all transactions");
        return this.http.get<Transaction[]>(this.transactionUrl);
    }

    getTransactionById(id : number) : Observable<Transaction> {
        this.logger.log("Request transaction " + id);
        return this.http.get<Transaction>(this.transactionUrl + id);
    }
}

Редактировать: я пробовал
https://spring.io/guides/gs/rest-service-cors/
Фильтр Spring Security CORS не работает
Конфигурация безопасности с Spring-boot
{ ссылка }

Подсказка: чистая установка перед повторным запуском приложения после изменения. Я идиот.

Исправлено с помощью этого вместо SecurityConfig. java:

@Component
public class SimpleCORSFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "36000");
        response.setHeader("Access-Control-Allow-Headers", "origin, content-type, accept");
        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {
    }

    public void destroy() {
    }
}

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Вам необходимо настроить CORS на методы вашего RestController, которые вы хотите разрешить. CORS - это ответ сервера.


    @CrossOrigin(origins = "http://localhost:4200")
    @GetMapping("/") 
    public List<Transaction> findAllTransactions() { 
        return transactionService.findAllTransactions(); } 
    } 
0 голосов
/ 07 апреля 2020

Вам необходимо добавить bean-компонент для настройки cors и включения cors в вашей конфигурации безопасности

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(final CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedMethods("*")
                    .allowedHeaders("*")
                    .allowCredentials(true).maxAge(3600);
        }
    };
}


@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .anyRequest()
            .permitAll()
            .and().cors().and().csrf().disable();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...