React- en Spring Boot CORS-problemen oplossen: geblokkeerd GET-verzoek

Temp mail SuperHeros
React- en Spring Boot CORS-problemen oplossen: geblokkeerd GET-verzoek
React- en Spring Boot CORS-problemen oplossen: geblokkeerd GET-verzoek

CORS-fouten in Spring Boot- en React-apps begrijpen

Bij het ontwikkelen van webapplicaties met behulp van Reageren voor de frontend en Lente laars voor de backend is een veelvoorkomend probleem waarmee ontwikkelaars worden geconfronteerd de beruchte CORS-fout. Deze fout treedt op wanneer de browser om veiligheidsredenen een verzoek blokkeert, vooral wanneer wordt geprobeerd verbinding te maken met een backend-service die op een andere poort of domein wordt gehost. In dit geval heeft u te maken met een CORS-probleem tijdens het maken van een KRIJG verzoek van Reageren op een Spring Boot API.

De foutmelding geeft meestal aan dat de browser uw verzoek blokkeert omdat de Toegangscontrole-Allow-Origin header ontbreekt of is onjuist geconfigureerd. Het is vermeldenswaard dat tools zoals Postbode dwing deze beveiligingsbeperkingen niet af. Daarom werkt uw verzoek mogelijk perfect in Postman, maar mislukt het in de browser.

In uw scenario geeft het foutbericht aan dat een preflightverzoek de toegangscontrole niet doorstaat. Dit gebeurt meestal wanneer bepaalde headers of methoden niet zijn toegestaan ​​of niet correct zijn geconfigureerd in het CORS-beleid van de server. Hoewel de CORS-configuratie aan de serverzijde aanwezig lijkt te zijn, kunnen er specifieke problemen zijn met de manier waarop browserverzoeken worden afgehandeld.

Dit artikel helpt u de hoofdoorzaak van het probleem te begrijpen en begeleidt u bij mogelijke oplossingen om het probleem op te lossen CORS-fout in uw React- en Spring Boot-applicatie.

Commando Voorbeeld van gebruik
@WebMvcConfigurer Een Spring Boot-annotatie die wordt gebruikt om webinstellingen zoals CORS, interceptors en formatters te configureren. In de context van dit probleem wordt het gebruikt om de CORS-toewijzingsregels te definiëren die specifieke oorsprongen en methoden toestaan.
allowedOrigins() Deze methode maakt deel uit van de CORS-configuratie en specificeert welke oorsprong toegang heeft tot de server. In dit geval zorgt het ervoor dat de frontend die op 'http://localhost:8081' draait, kan communiceren met de backend.
withCredentials() Een Axios-configuratie waarmee cross-origineverzoeken referenties zoals cookies en HTTP-authenticatie kunnen bevatten. Dit is van cruciaal belang bij het afhandelen van veilige verzoeken waarvoor gebruikersspecifieke gegevens nodig zijn.
MockMvcRequestBuilders.options() Een methode in het MockMvc-framework van Spring Boot die wordt gebruikt voor het simuleren van een HTTP OPTIONS-verzoek. Dit wordt doorgaans gebruikt om preflight-aanvragen in CORS af te handelen, waarbij de servertoestemming wordt gecontroleerd voordat het daadwerkelijke verzoek wordt verzonden.
HttpHeaders.ORIGIN Deze header wordt in CORS gebruikt om de oorsprong van het verzoek aan te geven. In een cross-origin scenario wordt dit van de frontend naar de server gestuurd om te verifiëren of de origin is toegestaan.
MockMvcResultMatchers.header() Dit is een methode die wordt gebruikt bij het testen van eenheden om te controleren op specifieke HTTP-headers in het antwoord. Het zorgt ervoor dat de header 'Access-Control-Allow-Origin' correct wordt geretourneerd als reactie op preflight-aanvragen.
Authorization: Bearer In het Axios-verzoek geeft deze header een Bearer-token door voor authenticatie. Het zorgt ervoor dat de backend de identiteit van de client die het verzoek doet, kan verifiëren.
useEffect() Een React Hook die wordt uitgevoerd nadat het onderdeel is weergegeven. In dit geval wordt het gebruikt om de API-aanroep naar de backend te activeren, waarbij projectgegevens worden opgehaald wanneer de component wordt geactiveerd.
axios.get() Een door Axios aangeboden methode om HTTP GET-verzoeken te doen. In dit scenario wordt het gebruikt om een ​​aanvraag naar de Spring Boot API te verzenden en projectgegevens op te halen.

Omgaan met CORS-fouten in React- en Spring Boot-applicaties

De hierboven gegeven scripts zijn bedoeld om het probleem op te lossen CORS-fouten in een React frontend en Spring Boot backend-opstelling. De fout treedt op wanneer de frontend, gehost op 'http://localhost:8081', probeert een GET-verzoek in te dienen bij een Spring Boot API die wordt gehost op 'http://localhost:8080'. Browsers hanteren strikte beveiligingsregels om ongeautoriseerde cross-origin-verzoeken te voorkomen. Daarom bestaat dit CORS-beleid. De WebMvcConfigurer klasse in de Spring Boot-backend-configuratie helpt bij het definiëren van CORS-regels die specifieke oorsprong en methoden toestaan, waardoor het probleem uiteindelijk wordt opgelost.

In de backend definieert het bestand `CorsConfig.java` een Spring Boot-configuratieklasse. De @Boon En @Overschrijven annotaties worden gebruikt om de CORS-configuratie te injecteren en aan te passen. In de methode `addCorsMappings()` staat de functie `allowedOrigins()` expliciet verzoeken van 'http://localhost:8081' toe, zodat de browser deze oorsprong als een vertrouwde bron herkent. De opname van `allowedMethods()` zorgt ervoor dat alle HTTP-methoden, inclusief GET, POST en OPTIONS, zijn toegestaan. Dit is van cruciaal belang omdat browsers doorgaans een preflight OPTIONS-verzoek verzenden om te controleren of het daadwerkelijke GET-verzoek is toegestaan.

Aan de frontend handelt React verzoeken af ​​met behulp van Axios, een populaire HTTP-client. In de `fetchData`-functie van het `ProjectPage.tsx`-bestand stuurt de `axios.get()`-functie een GET-verzoek naar de Spring Boot-backend. De optie `withCredentials` is ingesteld op true, waardoor cookies en authenticatiegegevens met het verzoek kunnen worden meegestuurd. Bovendien is de Authorization-header opgenomen om het token van de gebruiker door te geven, zodat de aanvraag correct wordt geverifieerd. Zonder deze configuraties zou de browser het verzoek om veiligheidsredenen blokkeren.

Ten slotte valideert het unit-testbestand, `CorsTest.java`, dat de CORS-configuratie werkt zoals verwacht. Deze test simuleert een HTTP OPTIONS-verzoek aan de backend-API, dat een echt preflight-verzoek van de browser nabootst. De test controleert of het antwoord de juiste headers bevat, zoals Toegangscontrole-Allow-Origin, waarmee cross-origineverzoeken vanaf de frontend mogelijk zijn. De methode `MockMvcResultMatchers.header()` zorgt ervoor dat de server correct reageert op preflightverzoeken. Door unit-tests op te nemen, kunnen ontwikkelaars ervoor zorgen dat hun CORS-configuratie betrouwbaar en functioneel is in verschillende omgevingen.

CORS-fouten oplossen in React + Spring Boot met configuratieaanpassingen

Benadering 1: Spring Boot CORS-configuratie gebruiken in de backend

// CorsConfig.java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
   @Override
   public void addCorsMappings(CorsRegistry registry) {
      registry.addMapping("/")
              .allowedOrigins("http://localhost:8081")
              .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
              .allowedHeaders("*")
              .allowCredentials(true);
   }
}

Axios gebruiken voor een goede CORS-afhandeling met cookies in React

Benadering 2: Reageer op de Axios-configuratie van de frontend voor cross-origin-aanvragen

// ProjectPage.tsx
const ProjectsPage = () => {
   const [projectsData, setProjectsData] = useState<ProjectsData[]>([]);
   const projectsUrl = 'http://localhost:8080/api/projects/admin/toinspection';
   useEffect(() => { fetchData(); }, []);
   const fetchData = async () => {
      const token = Cookies.get('token');
      try {
         const response = await axios.get<ProjectsData[]>(projectsUrl, {
            headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` },
            withCredentials: true
         });
         setProjectsData(response.data);
      } catch (error) {
         console.error("Error fetching projects:", error);
      }
   };
   return (
      <div>
         <AdminPageTemplate type="projects" children=<AdminModContent data={projectsData} />/>
      </div>
   );
};
export default ProjectsPage;

CORS-beleid testen met unit-tests in Spring Boot

Benadering 3: Unit-tests schrijven om het CORS-beleid te valideren

// CorsTest.java
@RunWith(SpringRunner.class)
@WebMvcTest
public class CorsTest {
   @Autowired
   private MockMvc mockMvc;
   @Test
   public void testCorsHeaders() throws Exception {
      mockMvc.perform(MockMvcRequestBuilders.options("/api/projects/admin/toinspection")
              .header(HttpHeaders.ORIGIN, "http://localhost:8081")
              .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET"))
              .andExpect(MockMvcResultMatchers.status().isOk())
              .andExpect(MockMvcResultMatchers.header().exists("Access-Control-Allow-Origin"))
              .andExpect(MockMvcResultMatchers.header().string("Access-Control-Allow-Origin", "http://localhost:8081"));
   }
}

CORS verkennen in de context van beveiliging en API-ontwerp

Bij het omgaan met CORS (Cross-Origin Resource Sharing) in moderne webapplicaties is het van cruciaal belang om de veiligheidsimplicaties erachter te begrijpen. CORS wordt door browsers geïmplementeerd als een beveiligingsmaatregel om te voorkomen dat kwaadwillende websites namens gebruikers ongeautoriseerde API-verzoeken indienen. Dit is vooral belangrijk in scenario's waarin gevoelige gegevens worden uitgewisseld tussen frontend- en backend-services, zoals authenticatietokens en gebruikersreferenties. Bij het opzetten van CORS in een Spring Boot-backend is het essentieel om alleen vertrouwde bronnen toegang te geven tot beschermde bronnen, waardoor de beveiligingsconfiguratie een belangrijk element van de systeemarchitectuur wordt.

Een ander cruciaal aspect is het afhandelen van preflightverzoeken, dit zijn automatische verzoeken die door de browser worden gedaan vóór het daadwerkelijke GET- of POST-verzoek. Dit gebeurt wanneer de client moet bevestigen of de server cross-origin-aanvragen toestaat en specifieke headers of methoden ondersteunt. In sommige gevallen zijn er verkeerde configuraties bij de verwerking hiervan preflight-aanvragen kan problemen veroorzaken, wat resulteert in CORS-fouten, zelfs als het daadwerkelijke verzoek prima werkt in tools zoals Postman. Het configureren van Spring Boot’s ‘CorsRegistry’ met de juiste headers en methoden zorgt ervoor dat preflight-verzoeken correct worden verwerkt, waardoor een soepele interactie tussen frontend en backend mogelijk wordt.

Bovendien mag de CORS-behandeling niet statisch of one-size-fits-all zijn. In dynamische omgevingen, zoals die welke worden beheerd met microservices, kunnen verschillende API's verschillende beveiligingsvereisten hebben. Sommige API's hoeven mogelijk alleen bepaalde methoden bloot te leggen, terwijl andere mogelijk een strengere controle over de oorsprong vereisen. Dit is waar het afstemmen van de CORS-configuratie voor elk eindpunt belangrijk wordt. Goed CORS-beheer helpt ook bij het optimaliseren van API-prestaties door onnodige preflight-verzoeken te verminderen en een soepele gebruikersinteractie te garanderen.

Veelgestelde vragen over CORS in React en Spring Boot

  1. Wat is CORS en waarom heb ik het nodig?
  2. CORS is een beveiligingsmechanisme dat door browsers wordt afgedwongen om cross-origin-verzoeken toe te staan ​​of te blokkeren. U hebt het nodig om ervoor te zorgen dat alleen vertrouwde bronnen toegang hebben tot uw API.
  3. Hoe schakel ik CORS in Spring Boot in?
  4. In Spring Boot kunt u CORS inschakelen door het @WebMvcConfigurer interface en het specificeren van toegestane oorsprong, methoden en headers met behulp van allowedOrigins En allowedMethods.
  5. Waarom werkt mijn verzoek in Postman maar mislukt het in de browser?
  6. Postman omzeilt browserbeveiligingsbeleid zoals CORS, maar browsers handhaven dit strikt. Zorg ervoor dat uw server de juiste CORS-headers naar de browser verzendt.
  7. Wat is een preflightverzoek?
  8. Een preflightverzoek is een automatisch verzoek OPTIONS verzoek verzonden door de browser om te controleren of het daadwerkelijke verzoek wordt toegestaan ​​door de server, met name voor niet-eenvoudige HTTP-verzoeken.
  9. Hoe kan ik mijn CORS-installatie testen?
  10. U kunt uw CORS-configuratie testen met MockMvcRequestBuilders.options() in unit-tests om preflight-verzoeken te simuleren en serverreacties te verifiëren.

Laatste gedachten over CORS in React en Spring Boot

Oplossen CORS-fouten in toepassingen met React en Spring Boot impliceert een duidelijk begrip van het beveiligingsbeleid dat door browsers wordt afgedwongen. Door de toegestane oorsprong en methoden in de Spring Boot-backend correct te configureren, kunnen de meeste van deze problemen worden voorkomen.

Bovendien zorgt het veilig omgaan met tokens in verzoeken en het garanderen van de juiste headers ervoor dat de communicatie tussen frontend- en backendsystemen soepel verloopt. Deze gids helpt bij het aanpakken van veelvoorkomende uitdagingen waarmee ontwikkelaars worden geconfronteerd, en zorgt voor veilige en functionele cross-originele verzoeken.

Bronnen en referenties voor CORS-oplossingen in React en Spring Boot
  1. Gedetailleerde informatie over de bediening CORS fouten in Spring Boot-applicaties zijn beschikbaar in de officiële Spring-documentatie. Spring Framework CORS-documentatie
  2. Om te begrijpen hoe u CORS in React-applicaties kunt beheren met Axios, kunt u deze handleiding raadplegen. Axios-aanvraagconfiguratie
  3. Dit artikel van Baeldung geeft inzicht in het configureren van CORS in een Spring Boot-omgeving. Baeldung - CORS-gids voor springlaarzen
  4. Het Mozilla Developer Network (MDN) biedt een uitgebreide uitleg van CORS en het belang ervan voor webbeveiliging. MDN-webdocumenten - CORS