From 0429ffd51d6fca99d4f1843b731aa5fc7773650f Mon Sep 17 00:00:00 2001 From: Arturo Gomez Date: Tue, 9 Jun 2026 18:09:15 -0600 Subject: [PATCH] =?UTF-8?q?fix(api):=20corregir=20pantalla=20en=20blanco?= =?UTF-8?q?=20por=20SpaController=20interceptando=20assets=20est=C3=A1tico?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springboot/MyTodoList/config/JwtAuthFilter.java | 4 ++-- .../springboot/MyTodoList/config/SpaController.java | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/MtdrSpring/backend/src/main/java/com/springboot/MyTodoList/config/JwtAuthFilter.java b/MtdrSpring/backend/src/main/java/com/springboot/MyTodoList/config/JwtAuthFilter.java index b574be6c1..9ed84ec57 100644 --- a/MtdrSpring/backend/src/main/java/com/springboot/MyTodoList/config/JwtAuthFilter.java +++ b/MtdrSpring/backend/src/main/java/com/springboot/MyTodoList/config/JwtAuthFilter.java @@ -38,8 +38,8 @@ protected void doFilterInternal(HttpServletRequest request, auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(auth); } - } else { - // Token present but expired/invalid → 401 so the frontend redirects to login + } else if (request.getRequestURI().startsWith("/api/")) { + // Solo bloquear rutas de API con token expirado; rutas SPA siguen al frontend response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.getWriter().write("{\"error\":\"Token expired or invalid\"}"); diff --git a/MtdrSpring/backend/src/main/java/com/springboot/MyTodoList/config/SpaController.java b/MtdrSpring/backend/src/main/java/com/springboot/MyTodoList/config/SpaController.java index 2e2fab604..06baf76b8 100644 --- a/MtdrSpring/backend/src/main/java/com/springboot/MyTodoList/config/SpaController.java +++ b/MtdrSpring/backend/src/main/java/com/springboot/MyTodoList/config/SpaController.java @@ -6,10 +6,14 @@ @Controller public class SpaController { - // Forward all non-file, non-API routes to index.html so React Router handles them + // Reenvía rutas SPA (sin extensión de archivo) a index.html para que React Router las maneje. + // Se usan patrones de profundidad fija (hasta 3 niveles) en lugar de /** para no interceptar + // assets estáticos como /static/js/bundle.js cuyos sub-segmentos sí contienen puntos. @RequestMapping(value = { - "/{path:[^\\.]*}", - "/{path:[^\\.]*}/**" + "/", + "/{p1:[^\\.]*}", + "/{p1:[^\\.]*}/{p2:[^\\.]*}", + "/{p1:[^\\.]*}/{p2:[^\\.]*}/{p3:[^\\.]*}" }) public String forward() { return "forward:/index.html";