package com.ffii.lioner.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // Apply to all API endpoints .allowedHeaders("*") // **** CRITICAL FIX HERE **** .allowedOrigins( "http://localhost", // If you test locally via Nginx at http://localhost "http://127.0.0.1", // Sometimes browsers resolve localhost to 127.0.0.1 "http://52.175.15.19", // Your 2fi-uat frontend IP "http://localhost:3000" // If you ever run React dev server directly // Add any other specific domains/IPs/ports where your frontend will be hosted ) // You had .exposedHeaders("filename") - keep if you need to read custom response headers .exposedHeaders("filename") // You had .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD") - This is missing "OPTIONS" .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS") // **** IMPORTANT: Add OPTIONS **** // You had .allowedHeaders("*") duplicated - harmless, but the first one is enough // .allowedHeaders("*") .allowCredentials(true) .maxAge(3600); // Recommended: Caches preflight results for 1 hour } @Bean public InternalResourceViewResolver defaultViewResolver() { return new InternalResourceViewResolver(); } }