Quarkus 3.4.3中基于注解实现Angular SPA客户端路由转发
Quarkus 3.4.3 实现Angular SPA客户端路由转发方案
针对你的需求,直接用@ServerRequestFilter(preMatching = true)即可实现,核心是精准判断哪些请求需要转发到index.html,同时保留浏览器地址栏的原路径供Angular路由处理。以下是可直接运行的示例代码:
import jakarta.ws.rs.container.ContainerRequestContext; import jakarta.ws.rs.container.ServerRequestFilter; import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.UriInfo; import jakarta.ws.rs.ext.Provider; import java.io.File; import java.net.URI; @Provider @ServerRequestFilter(preMatching = true) public class SpaRoutingFilter implements ServerRequestFilter { // 定义后端API的前缀,这类请求不参与SPA路由转发 private static final String API_PREFIX = "/api"; // Quarkus默认静态资源根目录,对应Angular打包后的文件存放路径 private static final String STATIC_RESOURCE_ROOT = "META-INF/resources"; @Context UriInfo uriInfo; @Override public void filter(ContainerRequestContext requestContext) { String requestPath = uriInfo.getPath(); // 跳过后端API请求 if (requestPath.startsWith(API_PREFIX)) { return; } // 跳过已存在的静态资源(如Angular打包后的js、css、图标等) File staticResource = new File(STATIC_RESOURCE_ROOT + File.separator + requestPath); if (staticResource.exists() && !staticResource.isDirectory()) { return; } // 仅对GET请求转发到index.html,保留原查询参数 if ("GET".equalsIgnoreCase(requestContext.getMethod())) { URI targetUri = uriInfo.getBaseUriBuilder() .path("index.html") .replaceQuery(uriInfo.getRequestUri().getQuery()) .build(); requestContext.setRequestUri(targetUri); } } }
关键说明:
preMatching = true:确保过滤器在Quarkus匹配具体资源之前执行,此时修改请求URI才会生效- API路径排除:避免后端REST接口被误转发到SPA页面
- 静态资源校验:确保已存在的静态文件(如Angular的打包产物)直接返回,不做转发
- 保留查询参数:通过
replaceQuery把原请求的查询参数带到index.html请求中,保证SPA路由能获取到参数
配套配置:
确保Angular打包后的所有文件(包括index.html)放在Quarkus项目的src/main/resources/META-INF/resources目录下,Quarkus默认会加载该目录的静态资源,无需额外配置。
内容的提问来源于stack exchange,提问作者badnun872
相关产品推荐
相关产品推荐

