From a48362e23289ac24d3d83a6745c73579e4aa998b Mon Sep 17 00:00:00 2001 From: Christian Thiel Date: Tue, 24 Sep 2024 08:55:09 +0200 Subject: [PATCH] fix: add redirect filter for React deeplinks to workaround 404 errors on reload --- .../adapter/in/rest/RedirectToIndexFilter.kt | 36 +++++++++++++++++++ frontend/src/router.tsx | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/kotlin/org/quizmania/rest/adapter/in/rest/RedirectToIndexFilter.kt diff --git a/backend/src/main/kotlin/org/quizmania/rest/adapter/in/rest/RedirectToIndexFilter.kt b/backend/src/main/kotlin/org/quizmania/rest/adapter/in/rest/RedirectToIndexFilter.kt new file mode 100644 index 0000000..bb8e567 --- /dev/null +++ b/backend/src/main/kotlin/org/quizmania/rest/adapter/in/rest/RedirectToIndexFilter.kt @@ -0,0 +1,36 @@ +package org.quizmania.rest.adapter.`in`.rest + +import jakarta.servlet.Filter +import jakarta.servlet.FilterChain +import jakarta.servlet.ServletRequest +import jakarta.servlet.ServletResponse +import jakarta.servlet.http.HttpServletRequest +import mu.KLogging +import org.springframework.stereotype.Component + +/** + * Redirect all deep links used in react app to index page to no get 404 on reload + */ +@Component +class RedirectToIndexFilter : Filter { + + companion object : KLogging() + + override fun doFilter( + request: ServletRequest, + response: ServletResponse?, + chain: FilterChain + ) { + val req = request as HttpServletRequest + val requestURI = req.requestURI + + if (requestURI.startsWith("/game") || requestURI.startsWith("/login") || requestURI.startsWith("/logout")) { + // all requests not api or static will be forwarded to index page. + logger.debug { "Forwarding $requestURI to index page" } + request.getRequestDispatcher("/").forward(request, response) + return + } + + chain.doFilter(request, response) + } +} diff --git a/frontend/src/router.tsx b/frontend/src/router.tsx index cba0d83..f9bd456 100644 --- a/frontend/src/router.tsx +++ b/frontend/src/router.tsx @@ -24,4 +24,4 @@ const routes: RouteObject[] = [ } ] -export const router = createHashRouter(routes); +export const router = createBrowserRouter(routes);