You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
        }
    }
}

关键说明:

  1. preMatching = true:确保过滤器在Quarkus匹配具体资源之前执行,此时修改请求URI才会生效
  2. API路径排除:避免后端REST接口被误转发到SPA页面
  3. 静态资源校验:确保已存在的静态文件(如Angular的打包产物)直接返回,不做转发
  4. 保留查询参数:通过replaceQuery把原请求的查询参数带到index.html请求中,保证SPA路由能获取到参数

配套配置:

确保Angular打包后的所有文件(包括index.html)放在Quarkus项目的src/main/resources/META-INF/resources目录下,Quarkus默认会加载该目录的静态资源,无需额外配置。

内容的提问来源于stack exchange,提问作者badnun872

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:22:33