如何在 spring boot 服务器中托管 angular 构建文件?

How to host angular build files in springboot server?

我有一个 spring 引导配置文件,类似于以下内容,

server:
  port: 8002
  servlet:
    context-path: /api/
...

spring:
  mvc:
    static-path-pattern: "/resources/**"
...

我已将我的 angular 项目的构建文件复制粘贴到 resources/resources/static

不知道这是否相关。 这是我的 JwtFilter.java,

@Component
public class JwtFilter extends OncePerRequestFilter {

    final private JwtUtil jwtUtil;

    @Autowired
    JwtFilter(JwtUtil jwtUtil) {
        this.jwtUtil = jwtUtil;
    }

    @Override
    protected void doFilterInternal(
      HttpServletRequest httpServletRequest,
      HttpServletResponse httpServletResponse,
      FilterChain filterChain
    ) throws ServletException, IOException {
        Cookie[] cookies = httpServletRequest.getCookies();
        if(cookies == null) {
            cookies = new Cookie[]{};
        }
        Cookie jwtCookie = Arrays.stream(cookies)
          .filter(cookie -> cookie.getName().equals(StringConstants.JWT_AT_COOKIE_NAME))
          .findFirst()
          .orElse(null);

        Cookie rtCookie = Arrays.stream(cookies)
          .filter(cookie -> cookie.getName().equals(StringConstants.RT_COOKIE_NAME))
          .findFirst()
          .orElse(null);

        if (rtCookie == null) {
            httpServletResponse.sendError(401, "REFRESH_TOKEN_NOT_FOUND");
            return;
        }

        String jwt = null;
        String uid = null;

        try {
            if (jwtCookie != null) {
                jwt = jwtCookie.getValue();
                uid = jwtUtil.extractSubject(jwt);
            } else {
                httpServletResponse.sendError(401, "User not authenticated!");
            }

            if (uid != null) {
                if (!jwtUtil.validateToken(jwt)) {
                    httpServletResponse.sendError(401, "EXPIRED_JWT_TOKEN_EXCEPTION");
                    return;
                }
            }
        } catch (SignatureException exception) {
            httpServletResponse.sendError(403, exception.getMessage());
            return;
        }
        filterChain.doFilter(httpServletRequest, httpServletResponse);
    }

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) {
        String path = request.getRequestURI();
        return path.equals("/api/auth") || path.equals("/api/auth/");
    }
}

我尝试将这些 js 构建文件添加到 META-INF/resources、public 和资源中。 也不去。

目录结构为:

现在如果我去 http://localhost:8002/ 然后它只是说 HTTP Status 404 – Not Found.

项目结构需要做更多的工作。

在此处查看问题。

删除这个。

spring:
  mvc:
    static-path-pattern: "/resources/**"

您想将 npm build 个工件放入 src/main/resources/static

首先,npm run build你会在dist/里面找到神器。

dist/ 中的任何内容复制到 src/main/resources/static/ 中。例如,dist/index.html 将被复制并粘贴到 src/main/resources/static/index.html.

强制 Springboot 服务 index.html

但是,这里有一个问题。如果您确实介意 url 中的哈希片段 #/foo/bar,您需要告诉 Springboot 在 404.

上提供 index.html
@SpringBootApplication
public class BlogApiApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(BlogApiApplication.class);
        app.run(args);
    }


    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {

        return new EmbeddedServletContainerCustomizer() {
            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {

                ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");

                container.addErrorPages(error404Page);
            }
        };
    }
}

这样就不需要哈希模式了。 React、Vue 也是如此。

Reference