Entendre els errors CORS a les aplicacions Spring Boot i React
Quan es desenvolupen aplicacions web utilitzant Reacciona per a la interfície i Bota de primavera per al backend, un problema comú als desenvolupadors és el famós error CORS. Aquest error es produeix quan el navegador bloqueja una sol·licitud per motius de seguretat, especialment quan s'intenta connectar-se a un servei de fons allotjat en un port o domini diferent. En aquest cas, esteu tractant un problema CORS mentre feu un GET sol·licitud de React a una API Spring Boot.
El missatge d'error sol indicar que el navegador està bloquejant la vostra sol·licitud perquè Accés-Control-Permetre-Origen falta la capçalera o està mal configurada. Val la pena assenyalar que les eines com Carter no apliqueu aquestes restriccions de seguretat, per això la vostra sol·licitud pot funcionar perfectament a Postman però fallar al navegador.
En el vostre escenari, el missatge d'error indica que una sol·licitud de control previ no passa la comprovació de control d'accés. Això sol passar quan determinades capçaleres o mètodes no estan permesos o configurats correctament a la política CORS del servidor. Tot i que la configuració de CORS sembla que està al seu lloc al costat del servidor, pot haver-hi problemes específics amb com gestiona les sol·licituds del navegador.
Aquest article us ajudarà a entendre la causa principal del problema i us guiarà a través de possibles solucions per resoldre'l Error CORS a la vostra aplicació React i Spring Boot.
Comandament | Exemple d'ús |
---|---|
@WebMvcConfigurer | Una anotació Spring Boot que s'utilitza per configurar paràmetres web com ara CORS, interceptors i formatadors. En el context d'aquest problema, s'utilitza per definir les regles de mapeig CORS que permeten orígens i mètodes específics. |
allowedOrigins() | Aquest mètode forma part de la configuració CORS i especifica quins orígens es permeten accedir al servidor. En aquest cas, assegura que la interfície que s'executa a "http://localhost:8081" es pot comunicar amb la part posterior. |
withCredentials() | Una configuració d'Axios que permet que les sol·licituds d'origen creuat incloguin credencials com ara galetes i autenticació HTTP. Això és crucial quan es gestionen peticions segures que necessiten dades específiques de l'usuari. |
MockMvcRequestBuilders.options() | Un mètode del marc MockMvc de Spring Boot utilitzat per simular una sol·licitud d'OPCIONS HTTP. Normalment s'utilitza per gestionar les sol·licituds de comprovació prèvia a CORS, comprovant el permís del servidor abans que s'enviï la sol·licitud real. |
HttpHeaders.ORIGIN | Aquesta capçalera s'utilitza a CORS per especificar l'origen de la sol·licitud. En un escenari d'origen creuat, això s'envia des de la interfície al servidor per verificar si l'origen està permès. |
MockMvcResultMatchers.header() | Aquest és un mètode que s'utilitza a les proves unitàries per comprovar si hi ha capçaleres HTTP específiques a la resposta. Assegura que la capçalera "Access-Control-Allow-Origin" es retorna correctament en resposta a les sol·licituds de preflight. |
Authorization: Bearer | A la sol·licitud d'Axios, aquesta capçalera passa un testimoni Bearer per a l'autenticació. Assegura que el backend pot verificar la identitat del client que fa la sol·licitud. |
useEffect() | Un React Hook que s'executa després de renderitzar el component. En aquest cas, s'utilitza per activar la crida de l'API al backend, obtenint les dades del projecte quan es munta el component. |
axios.get() | Un mètode proporcionat per Axios per fer sol·licituds HTTP GET. En aquest escenari, s'utilitza per enviar una sol·licitud a l'API Spring Boot i recuperar dades del projecte. |
Gestió d'errors CORS a les aplicacions React i Spring Boot
Els scripts proporcionats anteriorment tenen com a objectiu resoldre el problema de Errors CORS en una configuració de servidor de React i Spring Boot. L'error es produeix quan la interfície, allotjada a 'http://localhost:8081', intenta fer una sol·licitud GET a una API Spring Boot allotjada a 'http://localhost:8080'. Els navegadors apliquen regles de seguretat estrictes per evitar sol·licituds entre orígens no autoritzades, per això existeixen aquestes polítiques CORS. El WebMvcConfigurer classe a la configuració de fons de Spring Boot ajuda a definir regles CORS que permeten orígens i mètodes específics, resolent finalment el problema.
Al backend, el fitxer `CorsConfig.java` defineix una classe de configuració de Spring Boot. El @Bean i @Anul·lació les anotacions s'utilitzen per injectar i personalitzar la configuració CORS. En el mètode `addCorsMappings()`, la funció `allowedOrigins()` permet explícitament les sol·licituds de 'http://localhost:8081', assegurant-se que el navegador reconeix aquest origen com a font de confiança. La inclusió de `allowedMethods()` garanteix que tots els mètodes HTTP, inclosos GET, POST i OPTIONS, estiguin permesos. Això és crucial perquè els navegadors solen enviar una sol·licitud d'OPCIONS de control previ per comprovar si la sol·licitud GET real està permesa.
A la interfície, React gestiona les sol·licituds utilitzant Axios, un client HTTP popular. A la funció `fetchData` del fitxer `ProjectPage.tsx`, la funció `axios.get()` envia una sol·licitud GET al backend de Spring Boot. L'opció `withCredentials` està configurada com a true, permetent que les galetes i les credencials d'autenticació s'enviïn amb la sol·licitud. A més, s'inclou la capçalera Autorització per passar el testimoni de l'usuari, assegurant que la sol·licitud s'autentica correctament. Sense aquestes configuracions, el navegador bloquejaria la sol·licitud per motius de seguretat.
Finalment, el fitxer de prova d'unitat, `CorsTest.java`, valida que la configuració CORS funciona com s'esperava. Aquesta prova simula una sol·licitud HTTP OPTIONS a l'API de fons, que imita una sol·licitud de verificació prèvia real feta pel navegador. La prova comprova que la resposta conté les capçaleres correctes, com ara Accés-Control-Permetre-Origen, que permet sol·licituds d'origen creuat des de la interfície. El mètode `MockMvcResultMatchers.header()` garanteix que el servidor respon correctament a les sol·licituds de comprovació prèvia. En incloure proves unitàries, els desenvolupadors poden assegurar-se que la seva configuració CORS és fiable i funcional en diversos entorns.
Resolució d'errors CORS a React + Spring Boot amb ajustaments de configuració
Enfocament 1: Ús de la configuració de Spring Boot CORS al 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);
}
}
Ús d'Axios per a un maneig correcte de CORS amb galetes a React
Enfocament 2: Reaccioneu la configuració de Frontend Axios per a sol·licituds entre orígens
// 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;
Prova de polítiques CORS amb proves unitàries a Spring Boot
Enfocament 3: Redacció de proves unitàries per validar la política CORS
// 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"));
}
}
Explorant CORS en el context de la seguretat i el disseny d'API
Quan es tracta CORS (Compartició de recursos entre orígens) a les aplicacions web modernes, és crucial entendre les implicacions de seguretat que hi ha darrere. CORS s'implementa com a mesura de seguretat pels navegadors per evitar que els llocs web maliciosos facin sol·licituds d'API no autoritzades en nom dels usuaris. Això és especialment important en escenaris en què s'intercanvien dades confidencials entre serveis d'interfície i backend, com ara testimonis d'autenticació i credencials d'usuari. Quan configureu CORS en un backend de Spring Boot, és essencial permetre que només els orígens de confiança accedeixin als recursos protegits, fent de la configuració de seguretat un element clau de l'arquitectura del sistema.
Un altre aspecte crucial és la gestió de les sol·licituds de comprovació prèvia, que són peticions automàtiques fetes pel navegador abans de la sol·licitud GET o POST real. Això passa quan el client necessita confirmar si el servidor permet sol·licituds d'origen creuat i admet capçaleres o mètodes específics. En alguns casos, configuracions incorrectes en la gestió d'aquests sol·licituds prèvies al vol pot causar problemes, donant lloc a errors CORS fins i tot quan la sol·licitud real funciona bé en eines com Postman. Configurar el "CorsRegistry" de Spring Boot amb les capçaleres i els mètodes adequats garanteix que les sol·licituds de comprovació prèvia es processin correctament, permetent una interacció fluida entre la interfície i el backend.
A més, el maneig de CORS no hauria de ser estàtic o de mida única. En entorns dinàmics com els gestionats amb microserveis, les diferents API poden tenir requisits de seguretat diferents. Algunes API només necessiten exposar determinats mètodes, mentre que altres poden requerir un control més estricte sobre els orígens. Aquí és on esdevé important ajustar la configuració CORS per a cada punt final. La gestió adequada de CORS també ajuda a optimitzar el rendiment de l'API reduint les sol·licituds de control previ innecessàries i garantint una interacció fluida de l'usuari.
Preguntes freqüents sobre CORS a React i Spring Boot
- Què és CORS i per què el necessito?
- CORS és un mecanisme de seguretat aplicat pels navegadors per permetre o bloquejar sol·licituds d'origen creuat. Ho necessiteu per assegurar-vos que només els orígens de confiança poden accedir a la vostra API.
- Com habilito CORS a Spring Boot?
- A Spring Boot, podeu habilitar CORS configurant el @WebMvcConfigurer interfície i especificant els orígens, mètodes i capçaleres permesos allowedOrigins i allowedMethods.
- Per què la meva sol·licitud funciona a Postman però falla al navegador?
- Postman passa per alt les polítiques de seguretat del navegador com CORS, però els navegadors les apliquen estrictament. Assegureu-vos que el vostre servidor envia capçaleres CORS adequades al navegador.
- Què és una sol·licitud prèvia al vol?
- Una sol·licitud de vol previ és automàtica OPTIONS sol·licitud enviada pel navegador per comprovar si el servidor permet la sol·licitud real, especialment per a sol·licituds HTTP no simples.
- Com puc provar la meva configuració CORS?
- Podeu provar la vostra configuració CORS utilitzant MockMvcRequestBuilders.options() en proves unitàries per simular sol·licituds de control previ i verificar les respostes del servidor.
Pensaments finals sobre CORS a React i Spring Boot
Resolució Errors CORS en aplicacions amb React i Spring Boot implica una comprensió clara de les polítiques de seguretat aplicades pels navegadors. Si configureu correctament els orígens i mètodes permesos al backend de Spring Boot, la majoria d'aquests problemes es poden prevenir.
A més, gestionar els testimonis de manera segura a les sol·licituds i assegurar-se que s'enviïn les capçaleres adequades garantirà una comunicació fluida entre els sistemes d'interfície i de fons. Aquesta guia ajuda a abordar els reptes comuns als quals s'enfronten els desenvolupadors, garantint sol·licituds entre orígens segures i funcionals.
Fonts i referències per a solucions CORS a React i Spring Boot
- Informació detallada sobre la manipulació CORS errors a les aplicacions Spring Boot està disponible a la documentació oficial de Spring. Documentació de Spring Framework CORS
- Per entendre com gestionar CORS a les aplicacions React amb Axios, podeu consultar aquesta guia. Configuració de la sol·licitud d'Axios
- Aquest article de Baeldung proporciona informació sobre la configuració de CORS en un entorn Spring Boot. Baeldung - Guia CORS d'arrencada de primavera
- La xarxa de desenvolupadors de Mozilla (MDN) ofereix una explicació completa de CORS i la seva importància en la seguretat web. MDN Web Docs - CORS