Java 如何在springboot服务器中托管angular构建文件?
我有一个类似于下面的spring引导配置文件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
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/[包含角度构建文件]
- 资源/[包含角度构建文件]
- 静态/[包含角度构建文件]
- META-INF/
- 资源/
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添加到所有控制器。