Java 如何在springboot服务器中托管angular构建文件?

Java 如何在springboot服务器中托管angular构建文件?,java,spring,spring-boot,same-origin-policy,Java,Spring,Spring Boot,Same Origin Policy,我有一个类似于下面的spring引导配置文件 server: port: 8002 servlet: context-path: /api/ ... spring: mvc: static-path-pattern: "/resources/**" ... 我已将angular项目中的构建文件复制粘贴到resources/resources/static中 不知道这是否相关。 下面是我的JwtFilter.java @Component pub

我有一个类似于下面的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和resources中。 不,我也去那里

目录结构是:

  • 爪哇/
  • 资源/
    • 资源/
      • META-INF/
        • 资源/[包含角度构建文件]
      • public/[包含角度构建文件]
      • 资源/[包含角度构建文件]
      • 静态/[包含角度构建文件]
现在如果我转到
http://localhost:8002/
然后它就说
HTTP Status 404–未找到

项目结构需要更多的工作

看看这里的问题

删除此项

spring:
mvc:
静态路径模式:“/resources/**”
您希望将
npm build
工件放入
src/main/resources/static

首先,
npm运行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

@springboot应用程序
公共类博客应用程序{
公共静态void main(字符串[]args){
SpringApplication app=新的SpringApplication(BlogApiApplication.class);
应用程序运行(args);
}
@豆子
公共嵌入式ServletContainerCustomizer containerCustomizer(){
返回新的EmbeddedServletContainerCustomizer(){
@凌驾
public void自定义(ConfigurableMbeddedServletContainer){
ErrorPage error404Page=新的ErrorPage(HttpStatus.NOT_FOUND,“/index.html”);
容器。添加错误页(错误404页);
}
};
}
}
这样,就不需要哈希模式。反应也是一样,Vue


此:
端口:8002
配置-此
:8000
URL?@RandyCasburn我出于习惯键入8000。是8002。现在编辑尝试使用@sham访问它。但是没有起作用。我得到404,我认为
强制Sprinboot提供'index.html'
是特定于Sprinboot 1的。对于Springboot 2,我认为它是不同的。如果你也知道的话。请我试过这个<代码>@Bean public ErrorPageRegistrator ErrorPageRegistrator(){return registry->registry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,“/index.html”));}虽然不起作用,但在我添加过滤器以忽略index.html和任何相关js文件后,它起作用了。还需要注释掉servlet.context-path:/api/。是否有任何方法可以使用前缀/api,但也可以像正常情况下一样使用网站prefix@Nikhil.Nixel传统上,前端工件不嵌套在
.jar
包中。最佳实践是使用web服务器(如Nginx)从不同的位置为前端代码提供服务。如果您想了解这一点,请尝试在Nginx中使用
URL rewrite
reverse proxy
。如果您不选择Nginx服务器,请尝试不要使用
servlet.context path
。在api路径之前添加
/api
会更有组织性。一旦我将这些构建文件[html、js、资产]放在静态、资源、公共中,我就能够将所有内容捆绑在一个jar文件下。我通过错误页面放弃了路由控制。手动将/api添加到所有控制器。